【问题标题】:SequelizeJS Error: TypeError: User.findAll is not a functionSequelizeJS 错误:TypeError:User.findAll 不是函数
【发布时间】:2017-10-28 08:59:35
【问题描述】:

我在 expressjs 应用中使用sequelizejs

这是我的用户模型的代码。

user.js

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define('User', {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    bio: DataTypes.STRING,
    email: DataTypes.STRING,
    profile_picture: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      }
    }
  }, {
    tableName: 'users'
  });
  return User;
};

这是我的用户控制器

userComponent.js

const express = require( 'express' )
const router  = express.Router()
const User    = require( '../../models/user' )

router.get( '/user', ( req, res, next ) => {
  User.findAll()
    .then( userResponse => {
      res.status( 200 ).json( userResponse )
    } )
    .catch( error => {
      res.status( 400 ).send( error )
    } )
} )

module.exports = router

但是当我试图获取数据时,它会抛出这个错误:

TypeError: User.findAll 不是函数 在 router.get (D:\StateBoard-Project\v2\components\user\userComponent.js:6:8) 在 Layer.handle [as handle_request] (D:\StateBoard-Project\v2\node_modules\express\lib\router\layer.js:95:5) 在下一个 (D:\StateBoard-Project\v2\node_modules\express\lib\router\route.js:137:13) 在 Route.dispatch (D:\StateBoard-Project\v2\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [as handle_request] (D:\StateBoard-Project\v2\node_modules\express\lib\router\layer.js:95:5) 在 D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:281:22 在 Function.process_params (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:335:12) 在下一个 (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:275:10) 在 Function.handle (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:174:3) 在路由器 (D:\StateBoard-Project\v2\node_modules\express\lib\router\index.js:47:12)

这里是由 Sequelize 自动生成的 model/index.js 文件。

const fs        = require( 'fs' )
const path      = require( 'path' )
const Sequelize = require( 'sequelize' )
const basename  = path.basename( module.filename )
const env       = process.env.NODE_ENV || 'development'
const config    = require( __dirname + '/..\database.json' )[env]
const db        = {}

let sequelize
if (config.use_env_variable) {
  sequelize = new Sequelize( process.env[ config.use_env_variable ] )
} else {
  sequelize = new Sequelize( config.database, config.username, config.password, config )
}

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

Object.keys( db ).forEach( function( modelName ) {
  if ( db[ modelName ].associate ) {
    db[ modelName ].associate( db )
  }
});

db.sequelize = sequelize
db.Sequelize = Sequelize

module.exports = db

这里缺少什么?

【问题讨论】:

    标签: javascript node.js express sequelize.js


    【解决方案1】:

    您应该导入您的用户模型文件。

    eg. const user = require('../model/user');
    

    【讨论】:

      【解决方案2】:

      您应该在要使用模型的地方需要 models/index.js,而不是 models/user.js。

      const models = require( '../../models/index');
      
      router.get( '/user', ( req, res, next ) => {
        models.User.findAll()
          .then( userResponse => {
            res.status( 200 ).json( userResponse )
          })
          .catch( error => {
            res.status( 400 ).send( error )
          })
      } )
      

      【讨论】:

      • 我没有models/index.js 文件我该怎么办。在module.exports = function(sequelize, DataTypes) { 我认为sequelize 是库本身的对象,但DataTypes 对象代表什么?
      • 我没有models/index.js 文件我该怎么办。在module.exports = function(sequelize, DataTypes) { 我认为sequelize 是库本身的对象,但DataTypes 对象代表什么?
      【解决方案3】:

      您的 user.js 文件正在导出一个函数,但您从未实例化它。

      module.exports = function(sequelize, DataTypes) { // <-- function
      

      当你需要它时

      const User = require('../../models/user')
      

      现在User 是对该函数的引用。它从哪里得到sequelizeDataTypes

      【讨论】:

      • 嗨,Sequelize 自动在模型中生成了一个索引文件,model/index.js,我已经添加了上面的代码。我认为这个模型是在那里实例化的。
      • 是的,但是sequelize 是如何注入到您的User 模型中的呢?更像require('../../models/user')(sequelize, db)。然后你还需要导入 sequelize 和 db 才能使用它
      • 无论如何,在您的示例中,您正在从“user.js”文件中导入User,这将为您提供我提到的功能,而不是实例化模型。我会在文档中找到
      • 我认为您必须使用sequelize = new Sequelize(...); sequelize.import('../../models/user.js'); 实例化模型,这将传入sequelizeDataTypes
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2013-01-04
      • 1970-01-01
      • 2017-05-09
      • 2021-09-14
      • 2021-05-10
      相关资源
      最近更新 更多