护照js本地authentication使用sequelize

我正尝试使用护照本地身份validation与sequ​​elize。 当我提交login表单时,请求/响应周期永不结束,terminal中没有错误信息。

这里是我所有的代码:

app.js

var Sequelize = require('sequelize'), express = require('express'), bodyParser = require('body-parser'), cookieParser = require('cookie-parser'), passport = require('passport'), LocalStrategy = require('passport-local').Strategy, User = require('./models/users'); ........ and other imports..... //route import , model injection var auth = require('./routes/auth')(User); ....................... app.use(session({ store: new RedisStore(), secret: 'keyboard cat', resave: false, saveUninitialized: false })); app.use(passport.initialize()); app.use(passport.session()); passport.serializeUser(function(user, done) { console.log(user); done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id).then(function(user){ done(null, user); }).catch(function(e){ done(e, false); }); }); passport.use(new LocalStrategy( function(username, password, done) { User.findOne({where: {username: username}}).then(function(err, user) { if (err) { return done(err); } if (!user) { console.log('Incorrect username.'); return done(null, false, { message: 'Incorrect username.' }); } else if (password != user.password) { console.log('Incorrect password'); return done(null, false, { message: 'Incorrect password.' }); } else { console.log('ok'); done(null, user); } }); } )); 

和routes / auth.js:

 var express = require('express'), passport = require('passport'); var routes = function(User) { var router = express.Router(); // routes for registration router.route('/register') .get(function(req, res) { res.render('register'); }) .post(function(req, res) { User.count().then(function(number) { if (number >= 1) { res.redirect('/auth/login'); } else { User.create({ username: req.body.username, password: req.body.password }); res.redirect('/auth/login'); } }); }); //routes for login router.route('/login') .get(function(req, res) { res.render('login'); }) .post(function(req, res) { passport.authenticate('local', { successRedirect: '/dashboard', failureRedirect: '/auth/login' }); }); return router; }; module.exports = routes; 

为什么请求/响应周期不会结束?

您当前的./login POST中间件定义不正确,不会发送响应,这就是为什么它不会结束(直到超时)。

不要在中间件函数中调用passport.authenticate应该将调用passport.authenticate的结果用作中间件本身。 我build议如下:

 router.route('/login') .get(function(req, res) { res.render('login'); }) .post(passport.authenticate('local', { successRedirect: '/dashboard', failureRedirect: '/auth/login' }); ); 

有关示例,请参阅http://passportjs.org/docs/authenticate

注册码中的竞争条件

你没有问过这个问题,但是在你的中间件里有'./register'POST的竞争条件。

User.create返回保存创build的用户的承诺。 在此承诺解决之前,不保证用户存在于后备数据存储中。 但是,在调用create之后,您的代码会立即redirect到将为该用户查询数据库的login端点。

这是一些避免这个问题的代码:

 User.create({ ... }) .then(function() { res.redirect('/auth/login'); }) .catch(function(err) { // Handle rejected promise here }) 

包括catch是因为处理被拒绝的promise和抛出的exception总是一个好习惯。