2016-12-05 35 views
1

我正在尝试设置用户登录并使用节点中的ORM Sequelize进行注册。我有注册部分工作正常。我的模型实例被定义为User,当我调用User.createUser时,我的模型函数可以工作,并且一个用户被添加到数据库中。但是,当我尝试在我的护照本地策略中使用getUserNameById函数时,出现“用户未定义”错误。试图弄清楚这一点,我一直坚持了一整天。为什么只有当我尝试使用find函数时,我的sequelize模型才会定义?

模型文件(我已经导入sequelize,bcrypt,并创建一个连接)

var Users = connection.define("Users", { 
    id: { 
     type: Sequelize.INTEGER, 
     primaryKey: true, 
     autoIncrement: true, 
    }, 
    name: { 
     type: Sequelize.STRING 
    }, 
    username: { 
     type: Sequelize.STRING 
    }, 
    account: { 
     type: Sequelize.STRING 
    }, 
    email: { 
     type: Sequelize.STRING 
    }, 
    password: { 
     type: Sequelize.STRING 
    }, 

}, { 
    timestamps: false 
}); 


Users.sync(); 

connection.authenticate() 
    .then(function() { 
     console.log("CONNECTED! "); 
    }) 
    .catch(function (err) { 
     console.log("MYSQL ERROR: FAILED TO CONNECT"); 
    }) 
    .done(); 



module.exports = function (connection, DataTypes) { 
    return Users; 
} 


module.exports.createUser = function (newUser) { 
    bcrypt.genSalt(10, function(err, salt) { 
     bcrypt.hash(newUser.password, salt, function(err, hash) { 
      newUser.password = hash; 
      Users.create(newUser).then(function (Users){ 
       console.dir(Users.get()); 
      }) 
     }); 
    }); 
} 

module.exports.getUserByUsername = function (username) { 
    return Users.find({ 
     where: {username: username} 
    }).then(function (user) {}, function (err) { 
      console.log(err); 
    }); 
} 


module.exports.comparePassword = function(candidatePassword, hash, done, user){ 
    bcrypt.compare(password, hash, function(err, isMatch){ 
     if (err) console.log(err) 
     if (isMatch) { 
      return done(null, user) 
     } else { 
      return done(null, false) 
     } 
    }); 
} 



module.exports.getUserById = function(id, callback){ 
    Users.findAll({ 
     where: {id: id} 
    }); 
} 

我的航线代码,我有麻烦与

var User = require("../models/users"); 
var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function (username, password, done) { 
     User.getUserByUsername(username, function (user) { 
      if(!user){ 
       return done(null, false, {message:'Incorrect username'}) 
      } 
     }) 
     User.comparePassword(password, user.password, function (err, isMatch) { 
      if(err) throw err; 
      if(isMatch){ 
       return done(null, user); 
      }else{ 
       return done(null, false, {message: 'Invalid password'}); 
      } 
     }) 
    } 
)); 

回答

0

特别是当地的护照策略你./models/user类正在导出将connectionDataTypes作为参数的函数,但是您没有将它们传入 - 连接应该通过。您不应该致电connection.authenticate()

// new db connection 
var connection = new Sequelize(
    schema, 
    username, 
    password, 
    { 
     host: host, 
     dialect: dialect, 
    } 
) 
var DataTypes = // define DataTypes 

// pass into User 
var User = require("../models/users")(connection, DataTypes); 
相关问题