无法检索与MySQL的Sequelize的模型名称

我是nodejs和Sequelize ORM框架的新手。 我试图让它与MySQL的工作。 我已经取得了很大的进步,但目前我被困在需要加载模型的部分。 但是我得到一个错误,从文件中检索名字。

万维网

var debug = require('debug')('sampleapp') var app = require('../server'); var models = require('../model'); app.set('port', process.env.PORT || 3000); //server running models.sequelize.sync().then(function () { var server = app.listen(app.get('port'), function(){ debug('The magic is happening on port '+server.address().port); }); }); 

index.js

 "use strict" var fs = require('fs'); var path = require('path'); var Sequelize = require('sequelize'); var debug = require('debug'); var env = process.env.NODE_ENV || "development"; var config = require(path.join(__dirname, '..', 'config', 'config.json'))[env]; var sequelize = new Sequelize(config.database, config.username, config.password, config); 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 }); db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db; 

user.js的

 module.exports = function(sequelize, DataType){ var User = sequelize.define('user', { name: DataType.STRING, password: DataType.STRING, lastName: DataType.STRING, email: DataType.STRING, gender: DataType.CHAR, cellNumber: DataType.INTEGER }, { instanceMethods : { create : function(onSuccess, onError){ var name = this.name; var lastName = this.lastName; var email = this.email; var gender = this.gender; var cellNumber = this.cellNumber; var password = this.password; var shasum = crypto.createHash('sha1'); shasum.update(password); password = shasum.digest('hex'); User.build({name: name, lastName: lastName, email: email, gender: gender, cellNumber: cellNumber, password: password}) .save().success(onSuccess).error(onError); } } }); }; 

我不断收到这个错误在db [model.name] = model:

TypeError:无法读取未定义的属性“名称”

这个错误已经有一段时间了。 任何帮助将不胜感激

您有机会在model目录中选取非模型文件。 你有什么其他的文件在该目录? 你只想导入JavaScript文件,你的文件filter不够具体。 尝试强制它只检测JavaScript文件。 一个简单的方法是检查文件名的最后三个字符,并确保它们是.js

 (file.slice(-3) === '.js') 

将它添加到文件filter中,如下所示:

 .filter(function(file) { return (file.indexOf('.') !== 0) && (file !== "index.js") && (file.slice(-3) === '.js'); }) 

可能失败的另一个原因是sequelize的实例在实际导入模型之前没有成功实例化,并在静默中失败。 我使用这样的东西来确保在导入之前我有连通性:

 var sequelize = new Sequelize(foo, bar, baz); sequelize.authenticate().then(function() { console.log('Database connected and authenticated!'); return true; }).catch(function(err) { console.error('Failed to connect and authenticate', err); return false; }); 

如果你使用这样的东西,它会更容易发现错误。 尝试将数据库检查放在现有代码的上方(或者甚至只是暂时将代码注释掉),并确认您确实已成功连接。 一旦你确认你连接起来了,就可以更容易地debugging奇怪的东西了。

注意: 一旦确认数据库正在工作,不要将数据库检入。 这是一个Promise ,并不像fs.readdirSync()这样的同步函数。