我对这个错误消息感到困惑,并且不确定如何调试。我看了类似的问题,我认为我在代码中找到了需要修复的部分,但是我不确定该如何处理。
这是代码-
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');
}
});
答案 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');
});