发送标头后无法发送响应

时间:2016-04-05 16:53:19

标签: node.js express http-headers

目前我正在使用中间件开发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文件中。

关于如何解决这个问题的任何想法?

谢谢!

1 个答案:

答案 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);
});