如何处理nginx后面的nodejs中的错误?

时间:2014-08-25 04:16:08

标签: node.js nginx error-handling

我有处理nginx后面的nodejs / expressjs应用程序。在expressjs应用程序中,我有以下错误处理中间件:

app.use(function(req, res, next){
  res.status(404);

  // respond with json
  if (req.accepts('json')) {
    res.send({ error: 'Not found' });
    return;
  }

  // respond with html page
  if (req.accepts('html')) {
    res.render('404', { url: req.url });
    return;
  }

  // default to plain-text. send()
  res.type('txt').send('Not found');
});

app.use(function(err, req, res, next){
  res.status(err.status || 500);

  // respond with json      
  if (req.accepts('json')) {
    res.send({ error: 'Not found' });
    return;
  }

  // respond with html page
  if (req.accepts('html')) {
    res.render('500', { error: err });
    return;
  }

  res.type('txt').send('Internal error');
});

同样在nginx中,我有以下配置用于错误处理:

error_page 404 /404.html;
location = /404.html {
  internal; 
  root /path/to/static/html/;
}

error_page 400 500 502 503 504 /50x.html;         
location /50x.html {                 
  internal;                 
  root /path/to/static/html/;         
}

当我尝试通过nodejs发送一些错误时,请使用以下

res.status(500).json({error: 'Something happened'});

此错误处理nginx并且我得到完整的html错误页面响应而不是json响应。我认为这是由于以下nginx配置:

error_page 400 500 502 503 504 /50x.html;         
location /50x.html {                 
  internal;                 
  root /path/to/static/html/;         
}

如何设置nginx以仅处理nodejs服务器未处理的错误?

感谢。

1 个答案:

答案 0 :(得分:6)

您正在使用proxy_intercept_errors on指令。为了仅拦截某些错误代码,只需将error_page指令添加到具有代理的位置即可。否则他们是继承的。

这里我们只拦截400和502错误,其他一切都会传递给客户。

location / {
    proxy_pass http://myapp_upstream;
    proxy_intercept_errors on;
    error_page 400 502 /50x.html;
}