本文介绍了序列化findAll不是一个函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在与Sequelize进行一个项目,而我在这一步陷入困境.问题是,当我尝试登录并执行护照本地代码时,当它到达User.findAll(...)时,它会抛出findAll不是函数.

I'm making a project with Sequelize and I'm stucked in this step. The problem is that when I try to log in and the passport-local code is executed, when it reaches the User.findAll(...) it throws that findAll is not a function.

如果我创建console.log(User),它将显示[功能].

If I make console.log(User) it shows [function].

我的结构:

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

config.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:

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

}));

};

models/index.js

models/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

/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/');
...

那么,我在做什么错了?

So, what am I doing wrong?

推荐答案

nuke_users模块正在导出一个函数,该函数在调用时将返回Model.因为您没有调用此函数,所以它不会返回Model,因此您要查找的函数不存在.

The nuke_users module is exporting a function that, when called, returns the Model. Because you aren't calling this function, it is not returning the Model, and thus the function you are looking for does not exist.

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

To call this exported function you would need to pass in the sequelize instance and DataTypes, as so:

var User = require('../models/nuke_users')(sequelize, DataTypes);

在您的情况下,您正在index.js文件中使用加载程序,并且正在导出db对象,该对象包含以名称命名的模型.

In your case you are using a loader in the index.js file, and it is exporting the db object which contains the models keyed by their name.

var models = require('../models'); // loads index.js
var User = models.nuke_user;       // the model keyed by its name
User.findOne(...);                 // search the model

这篇关于序列化findAll不是一个函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 12:02