gpt4 book ai didi

javascript - unhandledRejection 后是否需要重新启动我的应用程序

转载 作者:行者123 更新时间:2023-12-05 01:09:35 27 4
gpt4 key购买 nike

我有一个 nodeJS 应用程序(服务器)并使用一些 3rd 方 npm 模块。同样在我的应用程序中,我有以下代码:

process.on("unhandledRejection", (reason, promise) => {
console.error(`Unhandled Rejection at: ${promise} reason: ${reason}`);
restartApp(); // ← Is this a must action?
});

似乎并非所有 promise 都被正确拒绝,在 3rd 方模块中,也可能在我的代码中。我知道这是使用此事件处理程序的最后一个资源。

捕获此未处理拒绝事件后的问题,我是否需要重新启动我的应用程序?

最佳答案

将错误分为两大类很有用:操作错误和程序员错误。

操作错误是(不可避免的)正确编写的程序遇到的运行时问题,例如磁盘已满、网络连接丢失等。

程序员错误是由代码中的错误或疏忽引起的,无法处理,因为它们会导致程序进入未知状态,它们可能在您的代码中您正在使用的模块中打电话。

程序员错误的最佳做法是立即崩溃。您应该使用重启器(见下文)运行您的程序,它会在发生崩溃时自动重启程序。安装了重启程序后,崩溃是面对短暂的程序员错误时恢复可靠服务的最快方法。

如果错误是操作错误,尝试恢复或重试操作可能有意义(如果这样做有意义)。例如,如果您收到 400 个错误,那么重试 REST 请求是没有意义的,但是如果您收到 500 个错误(系统可能会恢复),可能

在这个非常有用的指南中查看更多信息: https://www.joyent.com/node-js/production/design/errors

在您的特定情况下,您正在处理 unhandledRejection,这意味着应用程序处于未定义状态...与 unhandledException 非常相似,最好的办法是清理所有需要完成的事情,然后退出或重新启动,同时记录错误(这非常重要!错误是每天、每小时还是每分钟发生一次?)

我建议使用进程监视器,例如 PM2Forever .这些可以在您因错误退出时自动重启,并执行许多其他很酷的事情,例如记录这些事件。

这是 Heroku 关于同一主题的另一个不错的指南: https://blog.heroku.com/best-practices-nodejs-errors

博主 (Julián Duque) 甚至汇总了一些处理这些事件的最佳实践: https://blog.heroku.com/best-practices-nodejs-errors#putting-it-all-together

这看起来有点像:

const http = require('http')
const terminate = require('./terminate')
const server = http.createServer(...)

const exitHandler = terminate(server, {
coredump: false,
timeout: 500
})

process.on('uncaughtException', exitHandler(1, 'Unexpected Error'))
process.on('unhandledRejection', exitHandler(1, 'Unhandled Promise'))
process.on('SIGTERM', exitHandler(0, 'SIGTERM'))
process.on('SIGINT', exitHandler(0, 'SIGINT'))

终止模块:

function terminate (server, options = { coredump: false, timeout: 500 })    {
// Exit function
const exit = code => {
options.coredump ? process.abort() : process.exit(code)
}

return (code, reason) => (err, promise) => {
if (err && err instanceof Error) {
// Log error information, use a proper logging library here :)
console.log(err.message, err.stack)
}

// Attempt a graceful shutdown
server.close(exit)
setTimeout(exit, options.timeout).unref()
}
}

module.exports = terminate

我认为这种对这些事件进行托管、集中处理的方式是正确的方法。

关于javascript - unhandledRejection 后是否需要重新启动我的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65121968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com