Express.js和Sequelize:没有定义模型

Express.js and Sequelize: does not define models

本文关键字:定义 模型 js Sequelize Express      更新时间:2023-09-26

我正在使用express.js和sequelize开发小型应用程序。现在我有个问题。我学习了这个教程,并被卡住了。

我得到

TypeError: Cannot read property 'findAll' of undefined

对于

router.get('/news', function (req, res, next) {
  models.Article.findAll().then(function(article) {
    res.json(article);
  });
});

我的型号:

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Article = sequelize.define('Article', {
    title: DataTypes.STRING,
    content: DataTypes.TEXT
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  });
  return Article;
};

我通过github主持项目,任何代码都可以在那里看到。

谢谢你的帮助。

UPD:为路由/新闻添加了console.log(模型)。

错误在models/index.js中。在那里你有:

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

这排除了以.js结尾的所有文件。将最终条件更改为file.slice(-3) === '.js'意味着article.js不会被过滤掉。文章在Article.js.中定义

为了调试这一点,我在GET /news的路由器功能中添加了以下行:

console.log('KEYS TO models: ' + JSON.stringify(Object.keys(models)));

这向我表明,模型的唯一成员是sequelize和sequelize:

这可能与命名约定有关,因为Sequelize为模型名称添加了复数。好的做法是在模型定义中使用复数名称,这样以后在代码中就不会上当受骗。

尝试在代码和模型声明中将Article更改为Articles。

调试后,我发现default models/index.js有一个错误。当它遍历模型文件夹中的文件时,过滤器中存在一个条件

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

如果文件的扩展名为.js,则返回false。修复到

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

它会起作用的。祝你好运

完全正确的构造:

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(function(file) {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });