Node.js passport.js&;express:[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头

Node.js passport.js&;express:[ERR\u HTTP\u HEADERS\u SENT]:发送到客户端后无法设置头,node.js,express,passport.js,Node.js,Express,Passport.js,我正在将passport用于本地身份验证策略的教程粘在一起。以下是我的主文件中的内容: var passport = require('passport'); var Strategy = require('passport-local').Strategy; var db = require('./db'); // Initialize Passport and restore authentication state, if any, from the // session. app.us

我正在将passport用于本地身份验证策略的教程粘在一起。以下是我的主文件中的内容:

var passport = require('passport');
var Strategy = require('passport-local').Strategy;
var db = require('./db');

// Initialize Passport and restore authentication state, if any, from the
// session.
app.use(passport.initialize());
app.use(passport.session());

// Configure the local strategy for use by Passport.
//
// The local strategy requires a `verify` function which receives the credentials
// (`username` and `password`) submitted by the user.  The function must verify
// that the password is correct and then invoke `cb` with a user object, which
// will be set at `req.user` in route handlers after authentication.
passport.use(new Strategy(
  function(username, password, cb) {
    db.users.findByUsername(username, function(err, user) {
      if (err) { return cb(err); }
      if (!user) { return cb(null, false); }
      if (user.passwordhash !== password) { return cb(null, false); }
      return cb(null, user);
    });
  }));
然后,我的
db.users.findByUsername
函数如下所示:

exports.findByUsername = function(username, cb) {
  process.nextTick(function() {
   var q = `SELECT * 
         FROM USERS
        WHERE USERNAME = ?`;
 dbh.get(q, [username], (err, row) => {
  if (err) {
    return console.error(err.message);
  }

 return cb(null, row);
});

router.post('/login', 
  passport.authenticate('local', { failureRedirect: '/users/login' }),
  function(req, res) {
    res.redirect('/');
  });  

我的路线如下所示:

exports.findByUsername = function(username, cb) {
  process.nextTick(function() {
   var q = `SELECT * 
         FROM USERS
        WHERE USERNAME = ?`;
 dbh.get(q, [username], (err, row) => {
  if (err) {
    return console.error(err.message);
  }

 return cb(null, row);
});

router.post('/login', 
  passport.authenticate('local', { failureRedirect: '/users/login' }),
  function(req, res) {
    res.redirect('/');
  });  

结果是:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:558:11)
    at ServerResponse.header (C:\Users\Jujee\project1\project1\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\Users\Jujee\project1\project1\node_modules\express\lib\response.js:170:12)
[SNIP]

express为什么要这样做?如何修复它?

您正在尝试在passport.authenticate之后重定向用户,它可能会发送响应。试试
{successRedirect:'/successRoute',failureRedirect:'/users/login'}
好的,听起来不错