Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 处理express中的异常大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我无法理解如何处理看起来像是快递的一个非常基本的方面.如果我有一些代码在异步回调中抛出异常,我就无法捕获该异常,因为在回调运行时try / catch块不再在范围内.在这些情况下,浏览器将挂起,直到它最终放弃,表明服务器没有响应.这是一个非常糟糕的用户体验.我宁愿能够立即向客户端返回500@L_450_6@.认的快速@L_450_6@处理程序显然不处理这种情况.以下是一些示例代码
var express = require("express");

var app = express();
app.use(app.router);
//express error handler (never called)
app.use(function(err,req,res,next) {
    console.log(err);
    res.send(500);
});

app.get("/test",function(req,next) {
    require("fs").readFile("/some/file",function(err,data) {
        a.b(); //blow up
    });
});

app.listen(8888);

在上面的代码中,行a.b()抛出“ReferenceError:a is not defined”异常.永远不会调用定义的@L_450_6@处理程序.请注意,fs.readFile()返回的@L_450_6@对象在这种情况下为null,因为文件已正确读取.@L_450_6@是异步处理程序中的代码.

我已经阅读了有关使用Node的uncaughtExpception的this post,但the documentation说不使用该方法.即使我确实使用过它,我如何将500响应发送回用户?我不再使用快速响应对象了.

那么你如何处理这种情况?

解决方法

好的,我只是要发布一个完全不同的答案,因为我的第一个答案有一些有价值的信息,但事后才是主题.

简短的回答:正确的做法是已经发生的事情:您的程序应该打印堆栈跟踪并退出显示@L_450_6@.

潜在的想法:

所以我认为你需要虑不同类别的@L_450_6@.我的第一个答案是处理数据相关的@L_450_6@,这是一个编写良好的程序可以并且应该干净利落地处理.你所描述的是一个CRASH.如果您阅读了链接到的node.js文档,那么它是正确的.此程序在此时可以执行的唯一有用的事情是使用堆栈跟踪退出并允许进程主管重新启动它并获得理解状态.一旦程序崩溃,由于极其广泛的@L_450_6@可能是异常进入堆栈顶部的根本原因,它基本上是不可恢复的.在您的具体示例中,每次都会继续发生此@L_450_6@,直到修复源代码@L_450_6@并重新部署应用程序.如果您担心未经测试和@L_450_6@的代码将进入您的应用程序,添加更多未经测试和@L_450_6@的@L_450_6@处理代码并不能解决正确的问题.

但简而言之,不,没有办法获得引起此异常的http请求对象的引用,因此AFAIK无法改变最终用户在浏览器中感知的方式,而不是在中间反向代理层处理此问题您可以在哪里配置原始超时并发送更友好的@L_450_6@页面(对于任何不是完整HTML文档的请求,这当然是无用的).

节点中的@L_450_6@处理圣经

在我看来,Dave Pacheco的Error Handling in Node.js关于这个主题的权威性工作.它是全面,广泛和彻底的.我建议定期阅读和重新阅读.

解决@asparagino的评论,如果一个未处理的异常很容易重现或高频率发生,那不是一个边缘情况,这是一个@L_450_6@.正确的做法是改进代码,以便在面对这种情况时不会生成未捕获的异常.实际上处理条件,从而将程序员@L_450_6@转换为操作@L_450_6@,并且程序可以继续而无需重新启动且没有未捕获的异常.

大佬总结

以上是大佬教程为你收集整理的node.js – 处理express中的异常全部内容,希望文章能够帮你解决node.js – 处理express中的异常所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。