【问题标题】:Impossible to send response after headers have being sent发送标头后无法发送响应
【发布时间】:2016-04-05 16:53:18
【问题描述】:

目前我正在使用中间件开发 Express 应用程序。第一步,我需要对用户进行身份验证。在app.js 我已经:

app.post('/api/ecosystem/project/auth',
    middleware.authenticate,
    function(req,res){
    }
);

在中间件中,我需要访问用户提供的params,所以访问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');
               //...

当我尝试发送返回的状态码时出现问题。由于标头已设置,我不能使用带有错误参数的 res.send()、res.status()、next() 等。如果我这样做,我有一个关于 Headers have already been sent 的错误。有一个very amazing answer here about this

所以我可以只使用res.statusCode 但这不会返回状态并且不会停止流程。此外,我无法在 JSON 文件中以 err.message 的形式发送其他参数。

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

谢谢!!

【问题讨论】:

    标签: node.js express http-headers


    【解决方案1】:

    您可以将 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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2013-04-06
      相关资源
      最近更新 更多