Sequelize findAll不是一个函数

时间:2016-12-09 10:39:42

标签: mysql node.js express passport.js sequelize.js

我正在和Sequelize一起做一个项目而且我已经陷入了这一步。问题是,当我尝试登录并执行护照本地代码时,当它到达User.findAll(...)时,它会抛出findAll不是函数

如果我创建console.log(用户),则显示[function]。

我的结构:

  • /config/config.js
  • /config/passport.js
  • /models/index.js
  • /models/nuke_users.js(由sequelize-auto生成)
  • /index.js

config.js:

//Setting up the config
var Sequelize = require('sequelize');
var sequelize = new Sequelize('rocarenav2', 'root', '123456', {
   host: "localhost",
   port: 3306,
   dialect: 'mysql'
});

module.exports = sequelize;

passport.js:

// config/passport.js

// load all the things we need
var LocalStrategy   = require('passport-local').Strategy;

// load up the user model
var User            = require('../models/nuke_users');

var crypto          = require('crypto');

function hashPasswordForNuke(password) {
    return md5password =        crypto.createHash('md5').update(password).digest('hex');
}

// expose this function to our app using module.exports
module.exports = function(passport) {

// =========================================================================
// passport session setup ==================================================
// =========================================================================
// required for persistent login sessions
// passport needs ability to serialize and unserialize users out of session

// used to serialize the user for the session
passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// used to deserialize the user
passport.deserializeUser(function(id, done) {
    User.findById(id, {})
    .then(function (user) {
        done(err, user);
    })
    .catch(function (error){
        done(error);
    });
});



// =========================================================================
// LOCAL LOGIN =============================================================
// =========================================================================
// we are using named strategies since we have one for login and one for signup
// by default, if there was no name, it would just be called 'local'

passport.use('local-login', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { // callback with email and password from our form
    User.findAll({
        where: {
            'user_email': email
        }
    }).then(function (user) {
        if(!user)
            return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash

        // if the user is found but the password is wrong
        if ((user.user_password).localeCompare(hashPasswordForNuke(password)) === -1)
            return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata

        return done(null, user);
    })
    .catch(function (error){
        done(error);
    });

}));

};

模型/ index.js

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(module.filename);
var config    = require(__dirname + '/../config/config');
var db        = {};

//Create a Sequelize connection to the database using the URL in         config/config.js
var sequelize = config;

//Load all the models
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);
   }
});

//Export the db Object
db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

/models/nuke_users.js

/* jshint indent: 2 */

module.exports = function(sequelize, DataTypes) {
return sequelize.define('nuke_users', {
   user_id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
   },
   username: {
      type: DataTypes.STRING,
      allowNull: false,
      defaultValue: "",
      references: {
         model: 'reps_table',
         key: 'PostName'
      }
   },
   user_email: {
      type: DataTypes.STRING,
      allowNull: false,
      defaultValue: ""
   },
   user_avatar: {
      type: DataTypes.STRING,
      allowNull: false,
      defaultValue: ""
   },
   user_password: {
      type: DataTypes.STRING,
      allowNull: false,
      defaultValue: ""
   }
 }, {
    tableName: 'nuke_users'
 });
};

/index.js

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

那么,我做错了什么?

2 个答案:

答案 0 :(得分:12)

var checkbox = () => wrapper.find('input'); checkbox().should.not.be.checked(); checkbox().simulate('change', {target: {checked: true}}); ///... 模块正在导出一个函数,该函数在被调用时返回nuke_users。因为您没有调用此函数,所以它不会返回Model,因此您要查找的函数不存在。

要调用此导出的函数,您需要传递Model实例和sequelize,如下所示:

DataTypes

在你的情况下,你在var User = require('../models/nuke_users')(sequelize, DataTypes); 文件中使用了一个加载器,它正在导出index.js对象,其中包含由其名称键入的模型。

db

答案 1 :(得分:0)

而不是返回模型,而是从NukeUser.js导出模型:

const NukeUser = sequelize.define('nuke_users', {
    // ...
});

module.exports = NukeUser;

然后在index.js中输入

const NukeUser = require('../models/NukeUser');
NukeUser.findAll() //.then() ...