【发布时间】:2017-07-27 02:06:46
【问题描述】:
在使用 belongsTo/hasMany 时,我无法调用应该由 sequelize 生成的辅助方法。而且我不能急于加载一张桌子。 当尝试运行辅助方法时,我收到一条消息说没有这样的方法,当尝试使用 findAll 并包含传递另一个表时,它说这些表没有关联,请参阅下面的详细信息:
模型目录:
./models
--ticket.js
--category.js
--index.js
ticket.js
'use strict';
module.exports = function(sequelize, DataTypes) {
var Ticket = sequelize.define('Ticket', {
// category_id: DataTypes.INTEGER,
subject: DataTypes.STRING,
description: DataTypes.TEXT,
requester_name: DataTypes.STRING,
requester_email: DataTypes.STRING,
owner_email: DataTypes.STRING,
status: {
type: DataTypes.ENUM,
values: ['opened', 'in progress', 'closed']
}
}, {
underscored: true,
classMethods: {
associate: function(models) {
// associations can be defined here
Ticket.belongsTo(models['Category']);
Ticket.hasMany(models['Interaction']);
}
}
});
return Ticket;
};
category.js
'use strict';
module.exports = function(sequelize, DataTypes) {
var Category = sequelize.define('Category', {
name: DataTypes.STRING
}, {
underscored: true,
classMethods: {
associate: function(models) {
// associations can be defined here
Category.hasMany(models['Ticket']);
}
}
});
return Category;
};
index.js
'use strict';
var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var basename = path.basename(module.filename);
var env = process.env.NODE_ENV || 'development';
var config = require(__dirname + '/../config/config.json')[env];
var db = {};
if (config.use_env_variable) {
var sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
var sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(function(file) {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(function(file) {
var model = sequelize['import'](path.join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(function(modelName) {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
然后我为模型创建常量:
const models = require('../models'),
Ticket = models['Ticket'],
Category = models['Category'];
尝试调用 Ticket.getCategory() 时,如下所示:
Ticket.findById(req.params.ticket_id).then((ticket) => {
ticket.getCategory().then((category)=>{
ticket['category'] = category;
res.json(ticket);
});
});
我明白了:
Executing (default): SELECT `id`, `subject`, `description`, `requester_name`, `requester_email`, `owner_email`, `status`, `created_at`, `updated_at` FROM `Tickets` AS `Ticket` WHERE `Ticket`.`id` = '1';
Unhandled rejection TypeError: ticket.getCategory is not a function
如果我尝试使用预先加载,如下所示:
Ticket.findAll({where:{id:req.params.ticket_id},include:[Category]}).then((ticket) => {
res.json(ticket);
});
我明白了:
Unhandled rejection SequelizeEagerLoadingError: Category is not associated to Ticket!
我做错了什么?
提前致谢!
【问题讨论】:
-
你的sequelize版本是什么?
-
"sequelize": "^4.2.0", "sequelize-cli": "^2.7.0",
标签: mysql node.js sequelize.js