Sequelize:TypeError:User.hasMany不是一个函数
我有这个奇怪的行为。 我有一个用户模型和一个客户端模型。 用户有很多客户端。 我正在使用这个文档: http : //docs.sequelizejs.com/manual/tutorial/associations.html
当我运行服务器,Sequelize引发TypeError:User.hasMany不是一个函数
节点版本: 8.9.1
方言: postgres
数据库版本: Postgres 10
续集版本: 4.22.15
以下文件全部在同一个文件夹中
user.js模型
const Sequelize = require('sequelize'); const db = require('../index.js'); //This is an instance of new Sequelize(...) const tableName = 'users'; const User = db.define('user', { firstName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, lastName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, username: { //Username will be the email type: Sequelize.STRING(80), allowNull: false, unique: true, validate: { isEmail: true } }, password: { type: Sequelize.STRING, allowNull: false, validate: { notEmpty: true } }, isAdmin: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false }, isActive: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false } }, { tableName }); module.exports = User;
client.js模型
'use strict' const Sequelize = require('sequelize'); const db = require('../index.js'); const instanceMethods = { toJSON() { const values = Object.assign({}, this.get()); return values; }, }; const Client = db.define('clients', { ibid: { type: Sequelize.BIGINT, allowNull: true, defaultValue: null }, firstName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, lastName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, agreementSigned: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false }, totalBalance: { type: Sequelize.DECIMAL(11,2), allowNull: true, defaultValue: null }, currentAllocation: { type: Sequelize.STRING, allowNull: true, defaultValue: null } }, { instanceMethods }); module.exports = Client;
index.js模型
'use strict'; const User = require('./user') const Client = require('./client'); User.hasMany(Client); Client.belongsTo(User); module.exports = {User, Client};
在index.js中,你没有导出你已经初始化的新的sequelize实例,因此它不可用于client.js和user.js! define函数在您创build的sequelize实例对象上工作!
项目中还有一个循环依赖项,可能会造成问题!
我试了你的代码,改变了结构,现在就可以运行了! 可能还有其他的结构,但是这个对我来说很有用!
1)不要在index.js中创build一个新的sequelize实例,而是创build另一个文件,作为sequelize实例的初始化!
sequelize_index.js(我用这个文件来创build一个基础实例,然后在客户端和用户模型中使用这个基础实例)
const Sequelize = require('sequelize'); const dbconfig=require('./dbconfig.json'); const sequelize = new Sequelize('postgres://' + dbconfig.USER + ":" + dbconfig.PASSWORD + "@" + dbconfig.HOST + ":5432/" + dbconfig.DB, { host: dbconfig.HOST, dialect: dbconfig.DIALECT, pool: { min: 0, max: 5, idle: 1000 } }); module.exports={sequelize};
2)client.js看起来像这样!
'use strict' const Sequelize = require('sequelize'); const sequelize=require('./sequelize_index').sequelize; const db = require('./index.js'); const instanceMethods = { toJSON() { const values = Object.assign({}, this.get()); return values; }, }; const Client = sequelize.define('clients', { ibid: { type: Sequelize.BIGINT, allowNull: true, defaultValue: null }, firstName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, lastName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, agreementSigned: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false }, totalBalance: { type: Sequelize.DECIMAL(11,2), allowNull: true, defaultValue: null }, currentAllocation: { type: Sequelize.STRING, allowNull: true, defaultValue: null } }, { instanceMethods }); module.exports = Client;
3)User.js
const Sequelize = require('sequelize'); const sequelize=require('./sequelize_index').sequelize; const db = require('./index.js'); //This is an instance of new Sequelize(...) const tableName = 'users'; const User = sequelize.define('user', { firstName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, lastName: { type: Sequelize.STRING(50), allowNull: false, validate: { notEmpty: true } }, username: { //Username will be the email type: Sequelize.STRING(80), allowNull: false, unique: true, validate: { isEmail: true } }, password: { type: Sequelize.STRING, allowNull: false, validate: { notEmpty: true } }, isAdmin: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false }, isActive: { type: Sequelize.BOOLEAN, allowNull: false, defaultValue: false } }, { tableName }); module.exports = User;
4)index.js
'use strict'; const sequelize = require('./sequelize_index').sequelize; const User = require('./user') const Client = require('./client'); User.hasMany(Client); Client.belongsTo(User); sequelize.sync({force: false}).then(function () { console.log("Database Configured"); }); module.exports = {User, Client};
运行index.js后,数据库将被创build!