快递,护照:发送后不能设置标题
我仍然是节点和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) })