Reputation: 8791
I'm trying to use raw queries from sequelize in an express app. My folder structure is:
/
/index.js
/models/index.js
/models/price.js
/controllers/price.js
I want to use sequelize which I already define in /models/index.js from a controller.
This is /models/index.js:
"use strict";
var fs = require("fs");
var path = require("path");
var Sequelize = require('sequelize')
, sequelize = new Sequelize(process.env.MYSQL_DB, process.env.MYSQL_USER, process.env.MYSQL_PASSWORD, {
dialect: "mysql", // or 'sqlite', 'postgres', 'mariadb'
port: 3306, // or 5432 (for postgres)
timezone:'America/Sao_Paulo',
});
sequelize
.authenticate()
.then(function(err) {
console.log('Connection has been established successfully.');
}, function (err) {
console.log('Unable to connect to the database:', err);
});
var db = {};
fs
.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf(".") !== 0) && (file !== "index.js");
})
.forEach(function(file) {
var model = sequelize.import(path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(function(modelName) {
if ("associate" in db[modelName]) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
module.exports.db = db;
I want to use a raw query in my price controller:
exports.index = function(req, res, next) {
// var environment_hash = req.session.passport.user.environment_hash;
var Price = require('../models/index').Price;
var db = require('../models/index').db;
console.log(db);
db.query(`SELECT ... `).spread((results, metadata) => {
// Results will be an empty array and metadata will contain the number of affected rows.
console.log(results);
});
var values = {
where: { symbol: 'xxx' },
};
Price
.findOne(values)
.then(function(price) {
console.log("found!!!!!");
console.log(price);
res.render('home/home.ejs', {
price: price
});
});
};
But I'm getting this error message:
db: [Circular] }
TypeError: db.query is not a function
How can I fix this?
Upvotes: 3
Views: 7162
Reputation: 2153
The Sequelize library is being assigned to a variable on the db object.
The error is in the second file instead of calling
db.query
We should call
db.sequelize.query
In the first case we have called a function that does not exist. In another case we could assign the query function to a property on the db object.
db.query = db.sequelize.query
or you can de-structure using ES6
db.query = { query } = db.sequelize
Now we can run db.query
as expected.
Upvotes: 4