【问题标题】:Express, passport: can't set headers after they are sent快递、护照:发送后无法设置标题
【发布时间】:2016-01-07 00:15:41
【问题描述】:

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

使用 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

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

}));

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

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

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

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

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

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

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

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

    【讨论】:

    • 其实我只是想再次感谢你。你只是帮助我意识到我不了解异步的基础知识,现在我明白了,无论如何这部分。干杯!
    • 那你应该把这个问题标记为“已回答”,对吧? :)
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多