2017-09-10 42 views
0

当使用passport-local和sequelize for MySQL进行用户认证时,我遇到了belo提到的错误。当运行服务器时,它正在SQL中创建新表(如果尚未创建),但只要我点击注册按钮,就会显示错误。TypeError:在节点中使用sequelize时无法读取未定义的属性'findOne'

错误:

TypeError: Cannot read property 'findOne' of undefined 
    at Strategy._verify (E:\Web Development\node-SQL-Sequelize-passport-local\config\passport\passport.js:19:13) 
    at Strategy.authenticate (E:\Web Development\node-SQL-Sequelize-passport-local\node_modules\passport-local\lib\strategy.js:88:12) 
    at attempt (E:\Web Development\node-SQL-Sequelize-passport-local\node_modules\passport\lib\middleware\authenticate.js:361:16) 
    at authenticate (E:\Web Development\node-SQL-Sequelize-passport-local\node_modules\passport\lib\middleware\authenticate.js:362:7) 

server.js样子:

app.use(passport.initialize()); 

app.use(passport.session()); 




//Models 
var models = require("./app/models"); 

//Routes 
var authRoute = require('./app/routes/auth.js')(app,passport); 
require('./config/passport/passport.js')(passport, models.user); 

//Sync Database 
models.sequelize.sync().then(function() { 

    console.log('Nice! Database looks fine') 

}).catch(function(err) { 

    console.log(err, "Something went wrong with the Database Update!") 

}); 

app.get('/', function(req, res) { 

    res.send('Welcome to Passport with Sequelize'); 

}); 

user.js文件:

module.exports = function(sequelize, Sequelize) { 

    var User = sequelize.define('userInfo', { 

     id: { 
      autoIncrement: true, 
      primaryKey: true, 
      type: Sequelize.INTEGER 
     }, 

     firstname: { 
      type: Sequelize.STRING, 
      notEmpty: true 
     }, 

     lastname: { 
      type: Sequelize.STRING, 
      notEmpty: true 
     }, 

     username: { 
      type: Sequelize.TEXT 
     }, 

     about: { 
      type: Sequelize.TEXT 
     }, 

     email: { 
      type: Sequelize.STRING, 
      validate: { 
       isEmail: true 
      } 
     }, 

     password: { 
      type: Sequelize.STRING, 
      allowNull: false 
     }, 

     last_login: { 
      type: Sequelize.DATE 
     }, 

     status: { 
      type: Sequelize.ENUM('active', 'inactive'), 
      defaultValue: 'active' 
     } 


    }); 

    return User; 

} 

passport.js文件:

var bCrypt = require('bcrypt-nodejs'); 

module.exports = function(passport, user) { 
    var User = user; 
    var LocalStrategy = require('passport-local').Strategy; 
    passport.use('local-signup', new LocalStrategy(

    { 
     usernameField: 'email', 
     passwordField: 'password', 
     passReqToCallback: true // allows us to pass back the entire request to the callback 

    },function(req, email, password, done) { 
     var generateHash = function(password) { 

     return bCrypt.hashSync(password, bCrypt.genSaltSync(8), null); 

     }; 
     User.findOne({ 
     where: { 
      email: email 
     } 
     }).then(function(user) { 

      if (user) 

      { 

       return done(null, false, { 
        message: 'That email is already taken' 
       }); 

      } else 

      { 

       var userPassword = generateHash(password); 

       var data = 

        { 
         email: email, 

         password: userPassword, 

         firstname: req.body.firstname, 

         lastname: req.body.lastname 

        }; 


        User.create(data).then(function(newUser, created) { 

        if (!newUser) { 

         return done(null, false); 

        } 

         if (newUser) { 

          return done(null, newUser); 

         } 

        }); 

      } 

     }); 

    } 

)); 

} 

回答

0

回顾这个例子:github.com/sequelize/express-example。特别是用于模型加载的models/index.js。

这样,在该例子的处理是:

require('./config/passport/passport.js')(passport, models.userInfo); 

因为“用户信息”在模型中user.js的定义:

+0

是啊,现在工作! @alditis –

相关问题