发送 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);
});