gpt4 book ai didi

node.js - 在 express 中处理异常

转载 作者:搜寻专家 更新时间:2023-10-31 22:28:08 26 4
gpt4 key购买 nike

我无法理解如何处理似乎是 express 的一个非常基本的方面。如果我有一些代码在异步回调中抛出异常,我就无法捕获该异常,因为在回调运行时 try/catch block 不再在范围内。在这些情况下,浏览器将挂起,直到它最终放弃并声明服务器没有响应。这是非常糟糕的用户体验。我更希望能够立即向客户端返回 500 错误。默认的快速错误处理程序显然不处理这种情况。这是一些示例代码:

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, res, next) {
require("fs").readFile("/some/file", function(err, data) {
a.b(); //blow up
});
});

app.listen(8888);

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

我已阅读 this post关于甚至使用 Node 的 uncaughtExpception,但是 the documentation说不要使用那个方法。即使我确实使用了它,我又如何将 500 响应发送回用户? Express Response 对象不再供我使用。

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

最佳答案

好吧,我只是要发布一个完全不同的答案,因为我的第一个答案有一些有值(value)的信息,但事后看来与主题无关。

简短的回答:正确的做法是已经发生的事情:您的程序应该打印堆栈跟踪并退出并出现错误。

基本思路:

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

但简而言之,不,没有办法获得对导致此异常的 HTTP 请求对象的引用,因此据我所知,除了在中间处理此问题之外,您无法更改最终用户在浏览器中感知的方式反向代理层,您可以在其中配置粗略的超时并发送更友好的错误页面(这对于任何不是针对完整 HTML 文档的请求当然是无用的)。

Node 错误处理宝典

Error Handling in Node.js在我看来,戴夫·帕切科 (Dave Pacheco) 的著作是该主题的权威著作。它是全面的、广泛的和彻底的。我建议定期阅读和重读。


针对@asparagino 的评论,如果未处理的异常很容易重现或发生频率很高,那么这不是边缘情况,而是错误。正确的做法是改进您的代码,使其在面对这种情况时不生成未捕获的异常。实际处理条件,从而将程序员错误转化为操作错误,您的程序可以继续运行而无需重新启动,也不会出现未捕获的异常。

关于node.js - 在 express 中处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18408504/

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