【问题标题】:Cant retrieve the model name for Sequelize with mysql无法使用 mysql 检索 Sequelize 的模型名称
【发布时间】:2016-05-12 23:04:51
【问题描述】:

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

www

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: 无法读取未定义的属性“名称”

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

【问题讨论】:

    标签: mysql node.js express sequelize.js


    【解决方案1】:

    问题是找不到你创建的模型。

    return User
    

    为我工作。

    【讨论】:

      【解决方案2】:

      您可能会在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,不能很好地与 @ 等同步函数配合使用987654327@.

      【讨论】:

      • 感谢您的描述性回复。它有很大帮助。你会建议把数据库检查放在哪里?在 app.js 中?
      • 当然!我很高兴能帮上忙!老实说,数据库检查功能可以在任何地方运行,其唯一目的是验证您是否已连接到数据库。它基本上只是验证并运行一个简单的查询SELECT 1 + 1 以确保它可以做它需要做的事情。我不建议它存在于任何地方,而是你引导应用程序的地方。
      • 也可能是因为您没有在模型文件中返回任何内容
      猜你喜欢
      • 2023-04-08
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 2017-12-30
      • 2017-04-03
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多