首页 > 解决方案 > User.findAll 不是函数

问题描述

这是我的模型/user.js

var sequelize = require('sequelize');
var bcrypt = require('bcrypt');

module.exports = function(sequelize, DataTypes) {
    const User = sequelize.define('users', {
        user_id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true
        },
        user_name: DataTypes.DATE,
        email: DataTypes.STRING,
        password: DataTypes.STRING
    }, {
        freezeTableName: true,
        instanceMethods: {
            generateHash(password) {
                return bcrypt.hash(password, bcrypt.genSaltSync(8));
            },
            validPassword(password) {
                return bcrypt.compare(password, this.password);
            }
        }
    });

    return User;
}

这是我的模型/index.js

module.exports = {
    User: require('./user')
  };

这是我的 UserController.js

var sequelize = require("sequelize");
var models = require("../models/index");

var userController = {};

// Show list of users
userController.list = function(req, res) {
 models.User.findAll()
  .then( userResponse => {
    res.status( 200 ).json( userResponse )
  })
  .catch( error => {
    res.status( 400 ).send( error )
  });
};  

在 localhost 中执行上述代码时,会出现“User.findAll 不是函数”的错误。我尝试了各种方法,但没有结果。需要帮忙。我正在使用 express - nodejs - Sequelize(mysql2)

标签: node.jsexpresssequelize.js

解决方案


您需要将一个 sequelize 实例和一个 DataTypes 传递给您的 User.js

module.exports = function(sequelize, DataTypes)

因此,为了做到这一点,您应该将您的 models/index.js 更改为类似的内容。

var Sequelize = require("sequelize");
var user = require("./user");
var sequelize = new Sequelize("your db config goes here");

module.exports = {
    User: user(sequelize, Sequelize.DataTypes),
}

而且您不需要在每个文件中都要求 sequelize,将其从控制器和模型中删除

这里有一个示例 repo ,向您展示如何将 sequelize 与 express.js 一起使用,我们通常使用这样的 index.js 它将通过您的模型文件夹,您将能够使用访问模型db['User']


推荐阅读