繁体   English   中英

无法使用mysql检索Sequelize的模型名称

[英]Cant retrieve the model name for Sequelize with mysql

我是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文件和文件筛选器是不够具体。 尝试强制它仅检测javascript文件。 一种简单的方法是检查文件名的最后三个字符,并确保它们是.js

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

将其添加到文件过滤器中,如下所示:

.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;
});

如果您要使用类似的方法,将更容易发现错误。 尝试将数据库检查放在现有代码之上(甚至只是暂时将代码注释掉),并确认您实际上已成功连接。 一旦确认您已连接,调试奇怪的东西就会容易得多。

注意: 一旦确认工作正常,请勿将数据库检查留在那儿。 这是一个Promise ,不能与fs.readdirSync()类的同步功能fs.readdirSync()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM