nodejs 报错自动退出
当Node.js应用程序遇到错误时,如果不加以处理,可能会导致程序崩溃并自动退出。为了解决这个问题,我们可以通过监听uncaughtException
和unhandledRejection
事件来捕获未捕获的异常和未处理的Promise拒绝,从而优雅地关闭程序或记录日志以便后续排查。还可以通过配置进程管理工具如PM2来实现自动重启服务。
1. 使用全局事件监听器捕获异常
在Node.js中,可以通过监听全局对象process
上的uncaughtException
和unhandledRejection
事件来捕获未处理的异常和Promise拒绝。下面是一个简单的例子:
javascript
// 全局错误处理
process.on('uncaughtException', (err) => {
console.error('Uncaught Exception:', err.message);
console.error(err.stack);
process.exit(1); // 优雅退出
});</p>
<p>process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason.message);
console.error(reason.stack);
process.exit(1); // 优雅退出
});</p>
<p>// 示例:模拟一个未捕获的异常
setTimeout(() => {
nonExistentFunction(); // 这将触发 uncaughtException
}, 1000);</p>
<p>// 示例:模拟一个未处理的 Promise 拒绝
setTimeout(() => {
Promise.reject(new Error("Oops!")); // 这将触发 unhandledRejection
}, 2000);
2. 使用 try-catch 结构包裹异步代码
对于同步代码,可以使用try-catch结构来捕获并处理异常。而对于异步代码,则推荐使用async/await
结合try-catch的方式:
javascript
async function fetchData() {
try {
const response = await someAsyncOperation();
console.log(response);
} catch (error) {
console.error('Error occurred:', error.message);
console.error(error.stack);
}
}</p>
<p>fetchData();
3. 配置 PM2 自动重启服务
PM2 是一个流行的 Node.js 进程管理工具,它可以帮助你监控、重启和管理你的应用。即使你的应用因为未捕获的异常而崩溃,PM2 也可以自动重启它。
确保已经安装了PM2:
bash
npm install -g pm2
然后,使用PM2启动你的应用:
bash
pm2 start app.js
为了使应用在崩溃后自动重启,你可以添加--watch
参数让PM2监视文件变化,或者使用--restart-delay
设置延迟重启时间。
bash
pm2 start app.js --watch
pm2 start app.js --restart-delay=1000
通过以上几种方法可以有效地处理Node.js中的未捕获异常,防止程序因错误而自动退出,并且能够快速恢复服务正常运行。