首页 > 解决方案 > 捕获错误,但未退出应用程序 - NodeJS

问题描述

我是 NodeJS 的新手。我试着


#1

我试过了process.exit

我让我不想退出的应用程序

[nodemon] clean exit - waiting for changes before restart

#2

我也试了process.abort

我让应用程序崩溃,这是我不想要的。

[nodemon] app crashed - waiting for file changes before starting...

#3

我也试了uncaughtException

if(serviceType == 0 || serviceType == '' || serviceType == null) {
    console.error('\x1b[41m%s\x1b[0m', 'bad service type detected');
    process.on('uncaughtException', function (err) {
      console.error(JSON.parse(JSON.stringify(body)));
    });
}

我让控制台打印,但代码仍然继续运行,这是我不想要的


#4

我也试过throw new Error

if(serviceType == 0 || serviceType == '' || serviceType == null) {
    console.error('\x1b[41m%s\x1b[0m', 'bad service type detected');
    throw new Error(serviceType);
}

我让控制台打印,我让代码停止,但我在控制台中遇到了大错误

2018-05-30T17:45:37.307Z - info: The server is listening on port 3333
bad service type detected
{ mac: '102030405060' }
Error: 1
    at Promise (/Users/john/Sites/app/server/factories/policy-factory.js:23:27)
    at Promise._execute (/Users/john/Sites/app/node_modules/bluebird/js/release/debuggability.js:303:9)
    at Promise._resolveFromExecutor (/Users/john/Sites/app/node_modules/bluebird/js/release/promise.js:483:18)
    at new Promise (/Users/john/Sites/app/node_modules/bluebird/js/release/promise.js:79:10)
    at Object.policyFactory.create (/Users/john/Sites/app/server/factories/policy-factory.js:13:16)
    at fortinet.createPolicy (/Users/john/Sites/app/server/controllers/fortinet.js:44:47)
    at Layer.handle [as handle_request] (/Users/john/Sites/app/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/john/Sites/app/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/john/Sites/app/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/john/Sites/app/node_modules/express/lib/router/layer.js:95:5)
    at /Users/john/Sites/app/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/john/Sites/app/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/john/Sites/app/node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (/Users/john/Sites/app/node_modules/body-parser/lib/types/urlencoded.js:82:7)
    at Layer.handle [as handle_request] (/Users/john/Sites/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/john/Sites/app/node_modules/express/lib/router/index.js:317:13)
    at /Users/john/Sites/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/john/Sites/app/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/john/Sites/app/node_modules/express/lib/router/index.js:275:10)
    at /Users/john/Sites/app/node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (/Users/john/Sites/app/node_modules/raw-body/index.js:224:16)
    at done (/Users/john/Sites/app/node_modules/raw-body/index.js:213:7)
2018-05-30T17:45:46.817Z - error: POST /eventserver/ext/vcpe - 1
2018-05-30T17:45:46.818Z - debug: {"body":{"mac":"102030405060"}}
2018-05-30T17:45:46.818Z - verbose: {"token":""}

#5

我也试了return;

if(serviceType == 0 || serviceType == '' || serviceType == null) {
    console.error('\x1b[41m%s\x1b[0m', 'bad service type detected');
    return;
}

我让应用程序不会崩溃,并让代码停止它们所在的位置。

但是我的请求过程似乎挂了这么久。

我不确定这是否是最好的方法,但到目前为止,这种方法似乎实现了我想要做的很多事情。


问题

一个人将如何去实现这样的目标?


我现在愿意接受任何建议。

标签: javascriptnode.jsexpress

解决方案


如果您使用的是 Expressjs,您可以按照 Expressjs 网站中的建议定义错误处理中间件。由于最常用的 Node 框架是 express,我希望这可能会有所帮助。

app.use(function (err, req, res, next) {
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

这将捕获服务器端错误并发送消息而不会导致应用程序崩溃。官方链接https://expressjs.com/en/guide/error-handling.html


推荐阅读