【问题标题】:TypeError: Cannot read property 'findAll' of undefined (expressjs)TypeError:无法读取未定义的属性“findAll”(expressjs)
【发布时间】:2016-04-20 03:42:48
【问题描述】:

TypeError:无法读取未定义(expressjs)的属性“findAll”。

所有功能(续集)都不起作用。所有错误:无法读取属性“续集方法”...

module.exports = function (sequelize, DataTypes) {
var User = sequelize.define('user', {
    email: {type: DataTypes.STRING(32), unique: true, allowNull: false},
});

return User;
};

控制器:

models  = require('./../models');

exports.index = function (request, response, next) {
    models.User.findAll({attributes: ['id', 'username']});
};

【问题讨论】:

  • 请写你的./../models/index.js的内容,或者如果你以非标准方式初始化模型,请改写。
  • @KrzysztofSztompka, pastebin.com/Ev5Mp2AD
  • 谢谢,请写下你是如何运行db的
  • @KrzysztofSztompka, app.js pastebin.com/xwNV1Hmu

标签: javascript node.js express sequelize.js


【解决方案1】:

我遇到了同样的问题,以下更改对我有用。这可能对未来的用户有用 -

当你使用sequelize模型时,你需要使用定义好的模型类名,在findAll行中是“user”而不是“User”:

models  = require('./../models');
exports.index = function (request, response, next) {
    models.user.findAll({attributes: ['id', 'username']});
};

“用户”是分配了续集定义的变量,并且在该模型定义之外无法识别。 “用户”是正在创建的表名以及 sequelize 模型类名,这需要在任何类型的数据库查询中使用。

【讨论】:

    【解决方案2】:

    您已经创建了两个 sequelize 实例。第 12/14 行的 models/index.js 中的一个和第 19 行的服务器脚本中的第二个实例。然后您启动了第二个实例,但在模型中您尝试使用第一个实例。

    你的 model/index.js 文件没问题。 在你的服务器文件中添加

    var database = require('path/to/models');
    

    将您的数据库开始更改为:

    database.sequelize .authenticate() .then(function(err) { console.log('Connection has been established successfully.'); }, function (err) { console.log('Unable to connect to the database:', err); });

    您必须将“数据库”对象传递给您的控制器而不是 models = require('./../models');,并且您可以从您的控制器访问您的模型:database.User

    【讨论】:

    • 嗯,ReferenceError:exports.index (c:\webserver\data\htdocs\newcloudy\controllers\user.js:5:5) pastebin.com/tS89jbBp 中未定义数据库
    • 如何将数据库对象从服务器脚本传递到控制器?好像有点问题
    • var database = require('./../app.js');和 TypeError:无法读取未定义的属性“findAll”。
    • 不,你不能那样做。您在服务器脚本中运行控制器。您必须在服务器脚本中将数据库实例传递给您的控制器。请检查此stackoverflow.com/a/33096610/4138339 和“第二次编辑”。
    【解决方案3】:

    您的model/index.js 看起来不错。在您的控制器中尝试 findAll() 内部的 sequelize.sync().then(function () { 方法

    这是我解决问题的方法

    nb:我在里面有一个类似的 db.js 文件,而不是 models/index.js config 文件夹,其中包含 dbconnection 脚本和 sequelize 对象。

    我的 userController.js 看起来像(工作代码):

    var db = require('./../config/db'),
    seq = db.seq,
    Sequelize = db.Sequelize;
    
    module.exports = function(app) {
        app.get('/getUsers',function(req,res){
            var Users = require('../models/UserModel')(app); //since i am binding to a single object - app
            seq.sync().then(function () {
                Users.findAll({
                   attributes: ['usr_code', 'usr_name']
               }).then(function (users) {
                        users.forEach(function(user,index,arr){
                            console.log(user.usr_code);
                        });
                    });
            });
        });
    
    }
    

    希望这对您有所帮助。 :)

    【讨论】:

      【解决方案4】:

      我也有同样的问题,你需要检查你的表名。

      【讨论】:

        【解决方案5】:

        当关系或关联未使用数据库连接定义时,您可能会遇到此问题。

        【讨论】:

          猜你喜欢
          • 2020-11-25
          • 2016-09-07
          • 2020-01-23
          • 2021-07-17
          • 1970-01-01
          • 1970-01-01
          • 2019-10-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多