Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用ExpressJS处理错误_Node.js_Express - Fatal编程技术网

Node.js 使用ExpressJS处理错误

Node.js 使用ExpressJS处理错误,node.js,express,Node.js,Express,我尝试用ExpressJS处理503和500个错误,但它只适用于404错误 我的中间件: var error = function(server) { // 404 server.app.use(function(request, response) { response.status(404); response.redirect('/404'); }); // 500 server.app.use(function(error, request, re

我尝试用ExpressJS处理503和500个错误,但它只适用于404错误

我的中间件:

var error = function(server) {

  // 404
  server.app.use(function(request, response) {
    response.status(404);
    response.redirect('/404');
  });

  // 500
  server.app.use(function(error, request, response, next) {
    response.status(500);
    response.redirect('/500');
    next(error);
  });

  // 503
  server.app.use(function(error, request, response, next) {
    response.status(503);
    response.redirect('/503');
    next(error);
  });
};

module.exports = error;
function error500(request, response) {
  response.render('0-templates/' + response.locals.options.template + '/500', {
    _layoutFile: false,
    error: //how to get the error ?
  });
}
我的控制器中的功能(使用路由):

var error = function(server) {

  // 404
  server.app.use(function(request, response) {
    response.status(404);
    response.redirect('/404');
  });

  // 500
  server.app.use(function(error, request, response, next) {
    response.status(500);
    response.redirect('/500');
    next(error);
  });

  // 503
  server.app.use(function(error, request, response, next) {
    response.status(503);
    response.redirect('/503');
    next(error);
  });
};

module.exports = error;
function error500(request, response) {
  response.render('0-templates/' + response.locals.options.template + '/500', {
    _layoutFile: false,
    error: //how to get the error ?
  });
}

您缺少
404
回调的
error
参数,这使express相信它是一个中间件,而不是一个错误处理程序,因此对通过所述中间件的每个请求返回404

您还应该向所有错误处理程序添加
next
参数

发件人:

以与其他中间件函数相同的方式定义错误处理中间件函数,除了错误处理函数有四个参数而不是三个:(err、req、res、next)


不确定为什么要使用3个不同的函数,因为express中只有一个错误处理程序,您可以使用以下内容:

server.app.use((err, req, res, next) => {
  if (err.code) {
    res.status(err.code);
    console.log(err);
    return res.redirect('/'+err.code);
  } else {
    res.status(500);
    console.log(err);
    return res.redirect('/500');
  }
});
或者类似的,为了执行错误响应,您应该从逻辑代码中调用
next(err)


来源:和

为什么您的500和503函数没有与404函数相同的签名?为什么要使用try-catch块,当某个结果导致500或503
抛出新错误(“内部服务错误”)
响应。状态(500)
(503)
在您的路由中。另外,当您用500或503交换第一个状态代码时会发生什么?它运行404是因为它是第一个吗?它与
next(error)
一起工作,但我无法在控制器中获取错误消息。请参阅编辑。错误处理程序在中间件和控制器之后执行,因此错误处理程序中的
next()
调用express的默认错误处理程序