gpt4 book ai didi

node.js - 不使用 `next()`表达错误中间件吗?

转载 作者:行者123 更新时间:2023-12-03 08:44:11 25 4
gpt4 key购买 nike

我正在使用Express,并且想使用内置的中间件来处理错误。

我用这种方式-

app.use((err,req,res,next)=> {
console.log('error');
)};

现在,仅当我在路由器中使用 next(error)(其中 errorError类型的对象)时,此中间件才可用。
另一方面,如果我只是在路由器中添加 throw new Error(),则不会调用中间件。

有什么办法可以省略 next()吗?
这样,如果我的路由器中抛出任何错误,它将由中间件处理?

最佳答案

如果引发是同步的,则可以发明自己的请求处理程序包装器,该包装器将捕获所有异常并将其转换为对next()的调用:

app.get2 = function(path, fn) {
app.get(path, function(req, res, next) {
try {
fn(req, res, next);
} catch(err) {
next(err);
}
});
};

并且,示例用法:
app.get2("/test", function(req, res, next) {
throw new Error("testing..."); // will end up in next()
});

然后,如果您的 fn函数同步引发,那么它将被 get2()包装器捕获,并会自动为您调用 next(err)

如果异步抛出,则将无法正常工作。没有用于异步引发的通用包装器,因为引发异步回调的引发不会投给您的代码-它们会针对您正在使用的任何异步操作返回到异步基础结构中,并且只有它们才能捕获它。如果您仅将 promise 用于异步操作,则 promise 基础结构将自动捕获您的抛出并将其转变为拒绝的 promise ,您可以对返回和拒绝的 promise 执行与上述类似的操作。 Koa框架(Express的派生)已经做了类似的事情,我认为Express 5将具有类似的功能。

关于node.js - 不使用 `next()`表达错误中间件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58536012/

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