NodeJS Express js错误处理

q3qa4bjr  于 2023-04-20  发布在  Node.js
关注(0)|答案(6)|浏览(163)

我试图用express运行错误处理,但不是像我期望的那样看到“error!!!”的响应,而是在控制台上看到“some exception”,然后进程被杀死。这是错误处理应该设置的方式吗?如果是这样,是否有其他方法来捕获错误?

var express = require('express');
var app = express();

app.use(function(err, req, res, next) {
    console.log("error!!!");
    res.send("error!!!");
});

app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

app.listen(5000, function() {
  console.log("Listening on 5000");
});
z9gpfhce

z9gpfhce1#

https://expressjs.com/en/guide/error-handling.html上有一个关于错误处理的示例应用程序/指南,但是应该修复你的代码:

// Require Dependencies
var express = require('express');
var app = express();

// Middleware
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter)
app.use(function(err, req, res, next) {
    if(!err) return next(); // you also need this line
    console.log("error!!!");
    res.send("error!!!");
});

// Routes
app.get('/', function(request, response) {
    throw "some exception";
    response.send('Hello World!');
});

// Listen
app.listen(5000, function() {
  console.log("Listening on 5000");
});
p5fdfcr1

p5fdfcr12#

几个小技巧:
1)您的代码无法工作,因为您的错误处理程序中间件在到达您的路由之前运行,因此错误处理程序从未有机会将错误传递给它。这种风格称为延续传递。将错误处理程序放在中间件堆栈的最后。
2)当出现未处理的错误时,应该关闭服务器。
这意味着,你应该这样做:

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");
  server.close();
});

你可能还应该让server.close()超时,以防它无法完成(毕竟你的应用处于未定义状态):

var server = http.createServer(app);

app.use(function(err, req, res, next) {
  console.log("error!!!");
  res.send("error!!!");

  server.close();

  setTimeout(function () {
    process.exit(1);
  }, 3*1000);
});

我做了一个库,可以为你做所有这些,并允许你定义自定义响应,包括专门的错误视图,要服务的静态文件等。
https://github.com/ericelliott/express-error-handler

r6hnlfcb

r6hnlfcb3#

我也遇到了同样的问题,但不知道是哪里出了问题。问题是,如果你定义了express errorHandler,那么你的自定义错误处理程序就永远不会被调用。如果你有下一段代码,只需删除它:

if ('development' === app.get('env')) {
  app.use(express.errorHandler());
}

为我工作:)

rggaifut

rggaifut4#

安装express install connect-domain,然后执行如下操作:

var express = require("express"),  
    connectDomain = require("connect-domain"),
    app = express(),
    errorHandler;

//我们的错误处理程序

app.use(connectDomain());  
    errorHandler = function (err, req, res, next) {  
        res.send(500, {
           "status": "error",
           "message": err.message
        });
    console.log(err);
};

然后在设置端点时,在use()中将errorHandler添加到端点:

app.get("/some/data", function (req, res) {  
    // ... do some stuff ...
    res.send(200, "Yay! Happy Success!");
}).use(errorHandler);
cs7cruho

cs7cruho5#

创建错误函数:

function throwError(status, code, message) {
  const error = new Error(message);
  error.name = '';
  error.status = status;
  error.code = code;
  throw error;
}

例如

throwError(422, 'InvalidEmail', '`email` should be a valid email address')

我们将name分配给'',以便当我们toString错误时,它不会在它前面加上"Error: "
如前所述,如果你使用express,你可以通过指定4个参数来创建一个特殊的错误处理中间件:

app.use((err, req, res, next) => {
  if (err) {
    res.status(err.status || 500).json({ code: err.code || 'Error', message: err.toString() });
  }
});

如果您不使用express或其他首选项,请将该代码添加到catch处理程序中。
为什么
1.现代应用程序处理JSON,在JSON中抛出错误更有意义,并导致更干净的UI代码。
1.你不应该仅仅因为解析不精确而抛出错误消息。如果UI是一个多语言应用程序呢?在这种情况下,他们可以使用code来显示本地化消息。

m3eecexj

m3eecexj6#

发现食谱从这里,甚至在官方文档制动记录高级日志,如pino-http(至少对于最新的express4)。问题出现时,你这样写:

app.use((err, req, res, next) => {
  if (!err) {
     return next();
  }
  res.status(err.status || 500).json({ error });
});

Express“认为”这是正常结果,记录器未记录错误。

{
   ...
   "res":{"status":400},
   "msg":"request completed"
}

在这里修复(第一行):

res.err = err;
res.status(err.status || 500).json({ error });

修复后的日志输出:

{
   ...
   "res":{"status":400},
   "msg":"request errored",
   "err":{"type":"Error","message":"Some error","stack":"..skip.."}
}

相关问题