2016-01-04 40 views
2

我一直试图通过所有的答案已经这样做,但没有实现他们到我的代码。我明白发生了什么事情之前,我提供了错误响应的页面,另一个响应已发送给用户。另一方面,我不知道如何解决这个问题。错误:它们发送后无法设置标头 - Node.js

这里是我在我的脚本抛出一个错误:

if (!player) { 
     next(new HttpError(404, "Player not found")); // HttpError(status, message) 
    } 

要发送此错误给用户我用的方法sendHttpError.js这是这样的:

module.exports = function(req, res, next){ 

    res.sendHttpError = function(error){ 
     if(res.req.headers['x-requested-with'] == 'XMLHttpRequest'){ 
      res.json(error); 
     }else { 
      res.render("error", {error: error}); 
     } 
    }; 
    next(); 
}; 

这是一个点点增强表达错误处理:

app.use(function (err, req, res, next) { 

    if(typeof err == 'number'){ 
     err = new HttpError(err); 
    } 

    if(err instanceof HttpError){ 
     res.sendHttpError(err); 
    } else{ 
     if(app.get('env') == 'development'){ 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
     } else { 
     log.error(err); 
     err = new HttpError(500); 
     res.sendHttpError(err); 
     } 
    } 
    }); 

我是一个有点新的节点,并在C++来这样的js抓住这个令人困惑的面向事件的编程是有点困难:)

提前谢谢!

回答

1

最有可能的问题就在这里:

if (!player) { 
    next(new HttpError(404, "Player not found")); // HttpError(status, message) 
} 

放入next()调用前返回。

没有返回,下一个函数将被调用,但是路由处理程序也将继续执行。你可能有一个看起来像这样的处理器:

app.get('/foo', function(req, res, next){ 
    if (!player) 
     next(new HttpError(404, "Player not found")); // HttpError(status, message) 

    res.send({res:'ok'}); 

});  

下一个函数被调用,你的错误处理程序。也许它会向客户写回应。正常的res.send然后在您的处理程序中调用,并且您将得到“无法设置处理程序错误”。

更有可能res.send函数首先被调用,并且错误将在您的快速错误处理程序中引发。

相关问题