如何在expressjs应用中处理意外错误以避免停机?
首先,我想使用try-catch方法来处理意外错误,但它似乎只适用于同步代码。 我发现的其他方法是使用nodejs域模块,但它似乎已被弃用。
我使用快速生成器提供的标准错误处理中间件来处理错误。 我也在我的应用程序中使用npm forever模块。
使用像永远这样的过程监视器是否足够,或者我应该采用任何不同的方法来处理意外错误?
答案 0 :(得分:1)
我会推荐pm2永远,因为它有几个很棒的功能。我们在我们的生产网站上使用它,效果很好。启用日志记录以跟踪您的例外情况。
PM2允许您轻松管理日志。您可以实时显示所有应用程序日志,刷新它们并重新加载它们。还有不同的方法来配置PM2如何处理您的日志(在不同的文件中分开,合并,带有时间戳......),而无需修改代码中的任何内容。
答案 1 :(得分:0)
我已经在我的应用程序中通过在我的" index.js"中列出了未处理的错误来处理这个问题。
//Catch uncaught exceptions
process.on('uncaughtException', function (err) {
// handle the error safely
console.log(err);
});
答案 2 :(得分:0)
您可以使用生成器和承诺的组合来使用try-catch。 - https://gist.github.com/swarajgiri/16202e32aa4d80d45c62
捕获错误后,将其传递给npm install --save react react-relay graphql graphql-relay react-dom
。
server/app.js
您仍然需要// errors handler.
app.use(function (err, req, res, next) {
if (! err) {
return next();
}
res.status(500);
res.send('500: Internal server error');
});
或forever
来管理它。
答案 3 :(得分:0)
要直截了当地回答您,您无法处理意外的错误。这并不是说您无法处理错误,显然可以,应该和必须。我的意思是,如果处理了错误,那么程序就会预期到它,这不是意外的,如果程序没有预期到,那么它就是意外的,因此从本质上讲,如果您确实处理了意外的错误,那么您就不会处理意外的错误,就是您刚刚处理的错误。
作为开发人员,尽我们所能,尽我们最大可能彻底排除意外错误,尽管我们谁也不会成功。通过奉献和严格的努力,可以达到一定程度,在这种情况下,代码中确实发生的意外错误非常小,并且这种情况至少可以容忍到一定程度。错误处理是一个过程,通常会在Beta版发布后很长时间,甚至在第一个实际生产版发布后很长时间仍会继续。在收集数据的过程中,我将很快谈到,通过版本控制和补丁发现并消除了错误/错误,这些技术旨在即使在软件发布很长时间之后也可以继续提高软件的完整性。
您应该已经了解,没有一个单一的解决方案可以解决所有意外错误。作为开发人员,您应该在生产前消除应用程序中所有程序错误,并尽最大可能处理操作错误,这意味着您应该了解什么是程序错误以及操作错误。
#1。程序错误:代码本身内的错误和/或错误。
#2。 Operational-Errors-“在程序员无法控制的区域中发生的错误。错误是由客户端,网络,V8-Engine(虽然也可以是Programmatic的)引起的。
没有明确的方法将每个错误定义为操作错误还是编程错误,并且确实存在灰色区域。有一些查看有问题的错误的方法,可以帮助您做出确定的决定。如果您查看代码并发现无法解决该错误,则可以通过编写不同的代码或更多代码来解决它,这可能不是程序性错误。如果您在尝试连接到特定主机时遇到错误,并且在其他地方的连接都很好,则可能是可行的。即使错误地编写了应用程序代码,也会发生操作错误,只要确定您的代码完整性就正确即可。
这里有几个例子: 操作错误
这里有几个例子: 程序错误
正如我已经指出的那样,理解这两种错误类型的目的是使您作为开发人员可以消除所有错误,不仅要消除错误,还需要消除以消除一半的错误。体面的工作应用程序。在Node.js应用程序开发的世界中,这是将《英雄零》,《女人与女孩》,《光荣奇瓦瓦狗》与Sasquatch分开的部分(好吧,我偏爱奇瓦瓦狗)。
这实际上不是一个问题或主题,只能用一个衬里来回答,主要是因为,您不仅可以使用某些第三方NPM API处理所有意外错误,而且还因为学习并知道该怎么做才是不是学习更多的JavaScript语法,而是学习每个想要构建可靠,构建良好的Node.js应用程序的开发人员都需要了解的范例。
我知道你们中有些人现在正在sm嘴,以为您有答案,而且很简单。好吧,不是。那些正在使用的,捕获未捕获/意外错误的事件侦听器并没有将出色的应用程序投入生产(如果有的话)。我肯定希望您工作的任何公司都不要让您发布使用它的代码。对于那些不知道我在说什么的人,请在下面的文字块下面进行。仅供参考,它已经在本页上被建议,这让我震惊。
//Catch uncaught exceptions
process.on('uncaughtException', function (err) {
// handle the error safely
console.log(err);
});
上面是不执行操作的完美示例!!!!!!
如果错误意外发生,则正确的做法是将其作为错误对象抛出。不这样做会威胁到整个应用程序的完整性。请记住,当客户端不得不处理您失败的结果时,您将远离服务器,而被告知做正确的事。使用上述代码段会威胁服务器的安全性。其中包括访问服务器所需的信息,pem密钥,密码,所有数据库和数据库数据,以及所存储的所有客户端信息中最差的信息,包括所保留的所有信用卡和密码(请确保您是那种吹牛的人)的东西)。在启动以这种方式处理意外错误的应用程序的那一刻,一切都处于风险之中。
可能的问题包括:
实际上还有更多,尽管试图使另一个问题变得更好,但内存泄漏仍然是一个大问题。两者可以做得更好,作为开发人员,您只需要具有完整性,因此您的应用程序将具有完整性。
事件甚至发生的原因是为了记录和监视。它实际上是在每个节点实例运行时默认实现的,并且是Error对象如何通知您以及有关意外错误的一部分。下面是使用它的正确方法。
process.on('uncaughtExceptionMonitor', (err, origin) => {
MyMonitoringTool.logSync(err, origin);
// if needed pass the error to a function that will throw it...
});
以上是Node.js网站上的示例,您可以在其中进一步了解错误处理和意外错误。
Node.js Official Error Handling Documentation
最后,我们讨论错误监视器。对于小型应用程序,可能需要使用错误监视器才能完成令人满意的工作。知道您是否已经为错误和意外错误做好了足够的投入生产的唯一途径,是使自己感觉到所有操作错误都已得到处理,并且所有程序错误都已得到纠正。然后,您需要一个记录错误的日志记录系统。您可以构建自己的日志系统,也可以按常规购买一个。您将需要一个监视器,从技术上讲,您也可以构建一个监视器,对于大多数事情,我建议您尝试使用它,但是为此,我需要支付很少的月租费用,如果由于意外错误而崩溃,它将重新启动您的应用程序。>
上面的答案确实很糟糕,但这里面有一些好东西。我确实从上面喜欢的Node站点获得了帮助。我也从这里得到了帮助,我也一次又一次引用了这种资源,您也应该这样做。Handling Unexpected errors in Node Applications