发送 headers 后无法发送响应
Impossible to send response after headers have being sent
目前我正在使用中间件开发一个 Express 应用程序。第一步,我需要对用户进行身份验证。在 app.js
我有:
app.post('/api/ecosystem/project/auth',
middleware.authenticate,
function(req,res){
}
);
在中间件中,我需要访问用户提供的参数,所以我访问body
,设置headers。在 middleware/index.js
:
function authenticate(req, res, next){
var plainPassword = req.body.password,
userName = req.body.username;
models.connection.query(
`SELECT * FROM TABLE_1 WHERE username = ?`,
[userName] ,function(err, query) {
var err = true; //for testing purposes
if (err) res.statusCode = 500;
console.log('continues');
//...
当我尝试发送返回状态码时出现问题。由于已设置 headers,我不能使用 res.send()、res.status()、next() 和错误参数等。如果我这样做,我会得到关于 Headers have already been sent
的错误。有一个 very amazing answer here about this.
所以我可以只使用 res.statusCode
但这不会 return 状态也不会停止流程。此外,我无法在 JSON 文件中将其他参数作为 err.message
发送。
关于如何解决这个问题有什么想法吗?
谢谢!!
您可以将 statusCode 存储在 err
对象中并将其传递给 next
函数。如果你的路由定义正确,你应该有中间件来处理未处理的错误。该处理程序可以使用 err.statusCode
设置正确的响应状态代码。
function authenticate(req, res, next){
var plainPassword = req.body.password;
var userName = req.body.username;
models.connection.query(
`SELECT * FROM TABLE_1 WHERE username = ?`,
[userName],
function(err, query) {
if (err) {
err.statusCode = 500;
return next(err);
}
}
);
});
在你的routes.js
中你必须有:
YOUR ROUTES
app.use(function(err, req, res, next) {
res.status(err.statusCode).send(err);
});
目前我正在使用中间件开发一个 Express 应用程序。第一步,我需要对用户进行身份验证。在 app.js
我有:
app.post('/api/ecosystem/project/auth',
middleware.authenticate,
function(req,res){
}
);
在中间件中,我需要访问用户提供的参数,所以我访问body
,设置headers。在 middleware/index.js
:
function authenticate(req, res, next){
var plainPassword = req.body.password,
userName = req.body.username;
models.connection.query(
`SELECT * FROM TABLE_1 WHERE username = ?`,
[userName] ,function(err, query) {
var err = true; //for testing purposes
if (err) res.statusCode = 500;
console.log('continues');
//...
当我尝试发送返回状态码时出现问题。由于已设置 headers,我不能使用 res.send()、res.status()、next() 和错误参数等。如果我这样做,我会得到关于 Headers have already been sent
的错误。有一个 very amazing answer here about this.
所以我可以只使用 res.statusCode
但这不会 return 状态也不会停止流程。此外,我无法在 JSON 文件中将其他参数作为 err.message
发送。
关于如何解决这个问题有什么想法吗?
谢谢!!
您可以将 statusCode 存储在 err
对象中并将其传递给 next
函数。如果你的路由定义正确,你应该有中间件来处理未处理的错误。该处理程序可以使用 err.statusCode
设置正确的响应状态代码。
function authenticate(req, res, next){
var plainPassword = req.body.password;
var userName = req.body.username;
models.connection.query(
`SELECT * FROM TABLE_1 WHERE username = ?`,
[userName],
function(err, query) {
if (err) {
err.statusCode = 500;
return next(err);
}
}
);
});
在你的routes.js
中你必须有:
YOUR ROUTES
app.use(function(err, req, res, next) {
res.status(err.statusCode).send(err);
});