无法设置已发送的标头node.js / express

时间:2016-05-20 12:28:08

标签: node.js express

每当我第二次使用此URL时,我总是得到

  

无法设置已发送的标头

app.post('/auth/facebook', function(req, res, next) {
    // What should I do with the access token?
    User.findOne({ facebook: req.body.facebookId}, function(err, user) {
      // if user does exist then simply send the token back to the client
      if (user) {
        return res.send({ token: createJWT(user) })
      }
      // if user doesnt exist
      var user = new User();
      user.email = req.body.email;
      user.facebook = req.body.facebookId;
      user.first_name = req.body.first_name;
      user.last_name = req.body.last_name;
      user.save(function(err) {
        return res.send({ token: createJWT(user)})
      });
    });

  });

是因为我发送了两次令牌吗?

2 个答案:

答案 0 :(得分:0)

是的,发生此错误是因为您使用res.send设置响应标头两次。第一次设置它们时,即使它在if括号内,也是正常使用场景(大多数时候你会有一个用户返回)所以,第二次你调用它(这总是被执行),你已经设置它们(当用户存在时 - 大部分时间)。
我认为这与任何响应标头一起发生,例如KibGzr建议的res.json。这是一般性建议。关于你的问题,我会把没有用户的场景括起来,在里面我会执行创建新用户的逻辑。然后在括号外面,我会设置标题,因为我总是想要发送标记。像这样:

app.post('/auth/facebook', function(req, res, next) {
    // What should I do with the access token?
    User.findOne({ facebook: req.body.facebookId}, function(err, user) {
      // if user doesnt exist create one
      if (!user) {
        var user = new User();
        user.email = req.body.email;
        user.facebook = req.body.facebookId;
        user.first_name = req.body.first_name;
        user.last_name = req.body.last_name;
        user.save(function(err) {
          if(err){
            console.log(err);
          }
      });
      //Then send the token as a user exists anyway
      return res.send({ token: createJWT(user) }); 
    }
  });

所以一般的想法是,每个方案设置标题一次 - 确保每个方案没有设置两次响应。希望我帮忙。

答案 1 :(得分:0)

用户对象可以是null或user.Put if else块内的逻辑可以更容易地读取代码。在处理身份验证和注册时,始终控制台记录用户对象和req.body逻辑。让你的生活更轻松。

app.post('/auth/facebook', function (req, res, next) {
// What should I do with the access token?
User.findOne({facebook: req.body.facebookId}, function (err, user) {
    // if user does exist then simply send the token back to the client
    console.log(user);
    if (user != null) {
        return res.send({token: createJWT(user)})
    } else {
        // if user doesnt exist
        var user = new User();
        user.email = req.body.email;
        user.facebook = req.body.facebookId;
        user.first_name = req.body.first_name;
        user.last_name = req.body.last_name;
        user.save(function (err) {
            return res.send({token: createJWT(user)})
        });
    }
});