我有处理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服务器未处理的错误?
感谢。
答案 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;
}