快递,护照:发送后不能设置标题

我仍然是节点和webdev的noob,但努力!
我得到这个错误:发送后无法设置标题

同时使用passport.js和bcryptjs比较密码validation方法

路线/ login.js

var express = require('express') var router = express.Router() var mongoose = require('mongoose') var User = mongoose.model('User') var passport = require('passport') router.post('/', function (req, res, next){ passport.authenticate('local', function(err, user, info){ if(err){ return next(err); } if(user){ return res.json({token: user.generateJWT()}); } else { return res.status(401).send(info) } })(req, res, next); }); module.exports = router 

authentication/ local.js

 var passport = require('passport') var LocalStrategy = require('passport-local').Strategy var mongoose = require('mongoose') var User = mongoose.model('User') var bcrypt = require('bcryptjs') passport.use(new LocalStrategy(function(username, password, done) { User.findOne({ username: username }, function(err, user) { if (err) { return done(err) } if (!user) { return done(null, false, { message: { username: 'Incorrect username.' } }) } bcrypt.compare(password, user.password, function(err, isMatch) { if (err) { return done(err) } if (!isMatch) { return done(null, false, { message: { password: 'Incorrect password' } }) } }); return done(null, user); }); })); 

这validation正确的有效的用户名和密码,并login。

对于无效的用户名,它正确地拒绝login尝试。

但是对于一个无效的密码,它会login,然后崩溃与无法设置标头错误的应用程序。

但是,如果我将bcrypt.compare更改为bcrypt.compareSync ,则所有validation都是正确的。

 if (!bcrypt.compareSync(password, user.password)) { return done(null, false, { message: { password: 'Incorrect password' } }); } 

我宁愿不依赖于同步方法,所以请帮助我了解我哪里出错了!

bcrypt.compare()是asynchronous的,但是您立即调用done(null, user) 。 把它移入callback,它应该是罚款:

 bcrypt.compare(password, user.password, function(err, isMatch) { if (err) { return done(err) } if (!isMatch) { return done(null, false, { message: { password: 'Incorrect password' } }) } done(null, user) })