目前我正在使用中间件开发Express应用程序。第一步,我需要对用户进行身份验证。在app.js
我已经:
app.post('/api/ecosystem/project/auth',
middleware.authenticate,
function(req,res){
}
);
在中间件中,我需要访问用户提供的参数,因此我可以访问body
,设置标头。在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');
//...
当我尝试发送回状态代码时出现问题。由于标头已设置,我不能使用res.send(),res.status(),next()和错误参数等等。如果我这样做,则会收到有关Headers have already been sent
的错误消息。有very amazing answer here about this。
所以我只能使用res.statusCode
,但这不会返回状态并且不会停止流程。另外,我不能将其他参数作为err.message
发送到JSON文件中。
关于如何解决这个问题的任何想法?
谢谢!
答案 0 :(得分:1)
您可以将statusCode存储在err
对象中,并将其传递给next
函数。如果您的路由定义正确,您应该有中间件来处理未处理的错误。该处理程序可以使用err.statusCode
来设置正确的响应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);
});