javascript - express , Passport : can't set headers after they are sent

标签 javascript node.js express passport.js

我仍然是 node 和 webdev 的菜鸟,但正在努力!
我收到此错误:发送后无法设置 header

在平均堆栈上使用 passport.js 和 bcryptjs 比较方法进行密码验证时使用以下方法

routes/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

authenticate/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);
  });

}));

这会正确验证有效的用户名和密码,并登录。

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

但是对于无效的密码,它会登录,然后使应用程序崩溃并出现无法设置 header 错误。

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

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

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

最佳答案

bcrypt.compare() 是异步的,但您正在立即调用 done(null, user)。将它移到回调中,应该没问题:

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)
})

关于javascript - express , Passport : can't set headers after they are sent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645284/

相关文章:

javascript - nodejs 使用 cheerio 解析 xml 返回空 CDATA

node.js - Sequelize - NodeJS - 返回 o 函数未定义

node.js - Mongolab "quota exceeded"虽然我几乎没有达到最大允许大小的一半

javascript - 使用jquery检查按钮是否被点击

javascript - 在 OpenCPU 中使用 AngularJS $scope

angularjs - 这种类型的多属性过滤称为什么? (见截图)

node.js - Passport 反序列化用户未在 sails 中调用

javascript - 如何在 Mongoose.js 中应用字段类型验证而不会出现 CastError?

php - 表单未向电子邮件提交信息

javascript - 异步每个 vs forEach js