我有一个问题:如何为我的节点应用程序处理所有未被捕获的异常(操作/开发人员错误将关闭所有服务)。然后,每当发现错误时,我都可以向我发送电子邮件提醒。
答案 0 :(得分:34)
您可以使用process'unhandledRejection
'和'uncaughtException
'事件。
另请注意,在uncaughtException
'之后恢复正常操作是不安全的,因为the system becomes corrupted:
正确使用'
process .on('unhandledRejection', (reason, p) => { console.error(reason, 'Unhandled Rejection at Promise', p); }) .on('uncaughtException', err => { console.error(err, 'Uncaught Exception thrown'); process.exit(1); });
'是为了执行同步 清理已分配的资源(例如文件描述符,句柄等) 在关闭这个过程之前。
示例:
SELECT t.customerid,
COUNT(*) as cnt,
MAX(CASE WHEN t.productid = 1 THEN 1 ELSE 0 END) as first,
MAX(CASE WHEN t.productid = 2 THEN 1 ELSE 0 END) as second,
MAX(CASE WHEN t.productid = 3 THEN 1 ELSE 0 END) as third
FROM YourTable t
GROUP BY t.customerid
答案 1 :(得分:8)
您可以使用域名API:https://nodejs.org/api/domain.html 但它已被弃用,无论如何也不推荐。
通常,您希望在任何可能发生的地方处理错误,并避免采用“全部捕获”方法。
如果发生错误,忽略它就没有动力去解决它,在某些情况下可能会导致你甚至不知道你的程序出现故障。
相反,处理它的最佳方法是让程序崩溃,记录崩溃(和堆栈/核心转储),然后使用pm2或nodemon自动重启它。
对于Joyent(节点创建者)的(非常)漫长但富有洞察力的演讲,我强烈建议您阅读以下链接:Error handling in Node.JS
还有process.on('uncaughtException')
事件(您也不应该使用)
修改:了解更多细节并尝试解决您的问题。 使用像pm2这样的软件在崩溃时重新启动应用程序,您还可以看到error.log,它将为您提供堆栈跟踪。因此,似乎您仍然需要的唯一事情是警报崩溃。
为此,你可能想看看像keymetrics这样的接口(同样是pm2的人),这些接口可能会提醒你错误。
我很久以前使用过的一个很酷的解决方案如下:
我不需要推荐这个解决方案,但它符合您需要的所有规格,所以玩得开心!
Edit2:如果您想深入研究服务开发和最佳实践的主题,请查看@Paul在评论中建议的链接:https://12factor.net/
答案 2 :(得分:0)
最好的方法是让应用程序崩溃,记录错误然后重新启动进程。你可以像这样做
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; ++i) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
cluster.fork();
});
} else {
var http = require('http');
var httpServer = http.createServer(app).listen(httpPort, function () {
console.log('process id local', process.pid)
console.log("http server started at port " + httpPort);
});
}
process.on('uncaughtException', function (err) {
console.error((new Date).toUTCString() + ' uncaughtException:', err.message)
console.error(err.stack)
process.exit(1)
})
`