res.send 发送后无法设置标头

Posted

技术标签:

【中文标题】res.send 发送后无法设置标头【英文标题】:res.send Can't set headers after they are sent 【发布时间】:2015-12-25 20:02:03 【问题描述】:

您好,我在下面有此方法,但我无法确定为什么会出现此错误

错误:发送后无法设置标头。 在 ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11) 在 ServerResponse.header (/home/kwanso/Projects/myApp/Server/node_modules/express/lib/response.js:718:10) 在 ServerResponse.json (/home/kwanso/Projects/myApp/Server/node_modules/express/lib/response.js:246:10) 在/home/kwanso/Projects/myApp/Server/app.js:92:11 在 Layer.handle [as handle_request] (/home/kwanso/Projects/myApp/Server/node_modules/express/lib/router/layer.js:95:5) 在下一个(/home/kwanso/Projects/myApp/Server/node_modules/express/lib/router/route.js:131:13) 完成(/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/middleware/authenticate.js:243:13) 在/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/middleware/authenticate.js:250:15 通过(/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/authenticator.js:421:14) 在 Authenticator.transformAuthInfo (/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/authenticator.js:443:5) 在/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/middleware/authenticate.js:247:22 在/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/http/request.js:58:7 通过(/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/authenticator.js:267:43) 在序列化(/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/authenticator.js:276:7) 在 /home/kwanso/Projects/myApp/Server/app.js:97:3 通过(/home/kwanso/Projects/myApp/Server/node_modules/passport/lib/authenticator.js:284:9) -- 从 /home/kwanso/Projects/myApp/Server/node_modules/express/lib/application.js:629:43(function) 调用 EventEmitter.logerror)

我的方法如下:

passport.use(new LocalStrategy(
      function(username, password, done) 
        console.log("New Local Strategy");
        User.find( email: username , function (err, user) 
          console.log(user[0]._doc);
          if (err)  return done(err); 
          if (!user)  return done(null, false); 
          if (user[0]._doc.password != password)  return done(null, false); 
          console.log("sending");
          return done(null, user);
          console.log("sendt");
        );
        return done(null , false);
      
    ));

    var isValidPassword = function(user, password)
      return true;
    

    app.post('/login',
    passport.authenticate('local') ,
    function(req, res) 
      console.log("Back");
          res.send(req.user[0]);
    );

    passport.serializeUser(function(user, done) 
      console.log("Serialize User");
      done(null, user);
    );

    passport.deserializeUser(function(user, done) 
      console.log("De Serialize User");
      done(null, user);
    );

这似乎与在回调内部的回调方法中调用 res.send 有关。这是个问题吗?

【问题讨论】:

【参考方案1】:

您在 LocalStrategy 中两次调用 done 回调

函数结束时一次(用户名、密码、完成)

return done(null , false);

从数据库中获取用户后一次

  if (err)  return done(err); 
  if (!user)  return done(null, false); 
  if (user[0]._doc.password != password)  return done(null, false); 
  console.log("sending");
  return done(null, user);

只要去掉最后一行就可以了

  return done(null , false);

【讨论】:

以上是关于res.send 发送后无法设置标头的主要内容,如果未能解决你的问题,请参考以下文章

在nodejs中发送标头后无法设置标头

错误:发送后无法设置标头。

发送到客户端后无法设置标头

NodeJS "发送到客户端 NodeJS 后无法设置标头"

为啥显示此错误?发送到客户端后无法设置标头

UnhandledPromiseRejectionWarning:错误:发送后无法设置标头[重复]