将标头发送到客户端错误消息后,无法设置标头。为什么会收到此消息?

时间:2018-11-21 20:51:10

标签: node.js express callback

我对这个错误消息感到困惑,并且不确定如何调试。我看了类似的问题,我认为我在代码中找到了需要修复的部分,但是我不确定该如何处理。

这是代码-

app.post('/sign_up_results', function(req, res, next) {
    if (req.body.administrator === 'on') {
        data = {name : req.body.name, password: req.body.password, user: 'administrator'};
        pool.query('INSERT INTO users SET ?', data, function(err, result) {
        // If I omit this if statement it works fine
            if (err) {
                next(err);
                return;
            }
        });  
        res.render('review_papers');
    } else if (req.body.user === 'on') {
        data = {name : req.body.name, password: req.body.password, user: 'user'};
        pool.query('INSERT INTO users SET ?', data, function(err, result) {
        // If I omit this if statement it works fine
            if (err) {
                next(err);
                return;
            }
        });  
        res.render('upload_paper');
    }
});    

1 个答案:

答案 0 :(得分:0)

您必须特别注意回调函数pool.query。在旧代码中,

data = {
  name: req.body.name,
  password: req.body.password,
  user: 'administrator'
};
pool.query('INSERT INTO users SET ?', data, function (err, result) {
  // If I omit this if statement it works fine
  if (err) {
    next(err);
    return;
  }
});
res.render('review_papers');

res.render将比pool.query首先执行。因此,基本上您已经告诉请求已完成,而无需等待pool.query完成。

几秒钟后,pool.query完成。您的问题是因为您的查询遇到错误,因此将转到next(err),该错误还会告诉您您的请求已完成。这是无效的,因为您不能告知请求已完成多次。它导致Cannot set headers after they are sent to the client error message

简单的解决方法是将res.render移到pool.query内,例如

pool.query('INSERT INTO users SET ?', data, function (err, result) {
  // If I omit this if statement it works fine
  if (err) {        
    return next(err); // we can just return here
  }

  res.render('review_papers');
});