NodeJS Sequelize – 无法读取未定义的属性'_isSequelizeMethod'

我有一个使用Express的NodeJS服务器。 对于我的数据库,我使用Sequelize,并且像Sequelize文档中那样定义了我的模型:

车型/ index.js

"use strict"; var fs = require("fs"); var path = require("path"); var Sequelize = require("sequelize"); var sequelize = new Sequelize('mydb', 'root', '', { host: 'localhost', dialect: 'mysql', pool: { max: 5, min: 0, idle: 10000 } }); 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; 

车型/ server.js

 "use strict"; module.exports = function(sequelize, DataTypes) { var Server = sequelize.define('Server', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, unique: true, allowNull: false }, reference: DataTypes.STRING, name: DataTypes.STRING }, { timestamps: false, paranoid: false, underscored: true, freezeTableName: true, tableName: 'server' }); return Server; }; 

车型/ subscriber.js

 "use strict"; module.exports = function(sequelize, DataTypes) { var Subscriber = sequelize.define('Subscriber', { id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, unique: true, allowNull: false }, type: { type: DataTypes.ENUM, values: ['email', 'phone'] }, contact: DataTypes.STRING, server_id: DataTypes.INTEGER, notified: DataTypes.INTEGER, last_notified: DataTypes.DATE }, { timestamps: false, paranoid: false, underscored: true, freezeTableName: true, tableName: 'subscriber', classMethods: { associate: function(models) { Subscriber.belongsTo(models.Server, { foreignKey: 'server_id', targetKey: 'id' }); } } }); return Subscriber; }; 

在这里我的路线:

 var models = require('../models'); app.get('/subscribe/:type/:contact/:ref', function(req, res) { var type = req.params.type; var contact = req.params.contact; var ref = req.params.ref; models.Subscriber.findAll().then(function(result) { console.log(result); }); res.render('full/subscribed.twig', { type: type, contact: contact, server : server }); }); 

而当我访问我的路线,我有这个错误消息:

 Unhandled rejection TypeError: Cannot read property '_isSequelizeMethod' of undefined at /Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1077:20 at Array.map (native) at Object.QueryGenerator.selectQuery (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1067:55) at QueryInterface.select (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/query-interface.js:669:25) at null.<anonymous> (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/model.js:1398:32) at tryCatcher (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:510:31) at Promise._settlePromise (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:567:18) at Promise._settlePromise0 (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:612:10) at Promise._settlePromises (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:691:18) at Async._drainQueue (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:133:16) at Async._drainQueues (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:143:10) at Immediate.Async.drainQueues [as _onImmediate] (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:17:14) at processImmediate [as _immediateCallback] (timers.js:383:17) 

我试图做一个独立的NodeJS文件的一些经验,一切正常,我只是启动我的独立js文件与数据库上的一些行动,一切都很好。 当我在快速路线上做同样的事情时,我有这个错误…

有人有一个想法,为什么?

在此先感谢史蒂夫

何我的上帝! 我发现 !

这是因为我添加了一些function,对象原型…

当sequelize得到你的模型的选项对象,如果你有一些自定义函数在你的对象原型,它会失败…

在node_modules / sequelize / lib / dialects / abstract / query-generator.js(第1067行)

 mainAttributes = mainAttributes && mainAttributes.map(function(attr) { 

mainAttributes包含我这样的自定义函数:

 [ 'id', 'reference', 'name', [ undefined, 'join' ], [ undefined, 'getKeyByValue' ] ] 

我添加到Object的函数是join和getKeyByValue。

所以总结一下,当你使用Sequelize的时候,不要把自定义的函数添加到Object.prototype;)

希望它能帮助别人。

史蒂夫

当你导入一个表时,它已经被添加到sequelize.models数组中,所以你不需要再次添加明确的。 续集文档需要更新为以下内容:

 readdirSync(__dirname) .filter(file => (file.indexOf('.') !== 0) && (file !== 'index.js')) .forEach(file => { sequelize.import(path.join(__dirname, file)) }) Object .keys(sequelize.models) .forEach(modelName => { if ('associate' in sequelize.models[modelName]) { sequelize.models[modelName].associate(sequelize.models) } })