Node.js&Express-是否曾经创建错误对象并将其传递给中间件,而不首先在路由内声明?

Node.js&Express-是否曾经创建错误对象并将其传递给中间件,而不首先在路由内声明?,node.js,express,error-handling,Node.js,Express,Error Handling,环境:Node.js,Express 下面的模式将所有同步和异步错误对象转发给我的错误处理中间件 app.get('/', wrapAsync(async function(req, res, next) { // synchronous error throw new Error('oops'); // asynchronous error //next( new Error('oops I did it again'); res.send('he

环境:Node.js,Express

下面的模式将所有同步和异步错误对象转发给我的错误处理中间件

app.get('/', wrapAsync(async function(req, res, next) {

    // synchronous error
    throw new Error('oops');

    // asynchronous error
    //next( new Error('oops I did it again');

    res.send('hello world');
}));

function wrapAsync(fn) {
    return function(req, res, next) {
        fn(req, res, next).catch(next);
    };
}

app.use( function(error, req, res, next) {

    res.send(error);
});
但是,如果在我没有设置错误对象的代码中发生意外错误,该怎么办?node.js或Express是否会检测到我的路由中发生了错误,创建一个错误对象并通过wrapAsync包装函数将其转发给我的中间件?这对我来说很难下定决心,因为我不知道如何测试一些意想不到的东西

是否有一种模式可以确保路由中发生的所有可能错误都转发到错误处理中间件,而不会使服务器崩溃

但是,如果在我没有设置错误对象的代码中发生意外错误,该怎么办

如果除了您自己的代码之外,还有什么东西抛出了编程错误或意外异常,那么抛出的任何东西都将创建自己的异常。这是惯例,但并不完全要求抛出错误对象。自定义代码可以抛出一个字符串或它自己的对象(如果它愿意的话),尽管这不是常见的约定

解释器生成的异常(如TypeError)总是抛出某种类型的错误对象

node.js或Express是否会检测到我的路由中发生了错误,创建一个错误对象并通过wrapAsync包装函数将其转发给我的中间件

这不是正确的想法。这不是Express或node.js做的。不管是什么代码首先导致或抛出异常,要么手动抛出异常,要么解释器遇到导致异常的错误。这是一个例外,它们来自哪里。因为您已经在异步函数中包装了内容,所以您可能会在.catch处理程序中看到该异常及其关联的错误对象

但是,在某些情况下,您仍然看不到异常。如果包装器中的某些异步代码使用普通回调而不是承诺,并在该普通异步回调中引发异常,那么包装器将不会捕获该异常,而不会捕获任何异常。这就是为什么此体系结构中的所有异步代码都应该使用promisified异步函数的原因,因为它支持您所依赖的自动错误传播

是否有一种模式可以确保路由中发生的所有可能错误都转发到错误处理中间件,而不会使服务器崩溃

否。如果函数使用普通的、非约定的异步回调,则不会。如上所述,在这种情况下,错误不会传播到包装器


仅供参考,有关将拒绝承诺检测构建到Express中的方案,请参阅。还有Express Course,作为其体系结构的一部分,它更自动地执行此操作。

您的链接是金色的,我已经阅读了两遍。有一个小的技术细节我不明白。在该行中,fnreq、res、next.catchnext;为什么它不能捕捉下一个新的错误或类似的东西?看起来我正在传递一个没有任何参数的方法引用。它如何知道使用什么?@myNewAccount-Because.catchnext告诉承诺,如果它收到错误,它应该调用nexter,其中err是该承诺的拒绝原因。它与.catcherr=>nexterr相同。这个err已经是被拒绝的承诺中的一个Error对象了——它不需要再次包装在一个中。这很有趣。是否有一个超基本甚至很小的代码模式,我可以用不同的方式测试这个概念?参数知道如何在不包含参数的情况下进入函数引用的行?就像接球一样。下一个是什么?MyFunctionNotherFunction我想如果我能用另一种方式测试它,我的大脑就能理解这个基本概念。@myNewAccount-.catch希望你给它传递一个函数引用,这个函数引用期望传递一个参数给它,它可能在将来某个时候用这个参数调用这个函数。接下来就是一个函数引用,它期望用零个或一个参数调用。这不是唯一的。抓住。对于任何希望您向其传递回调的函数,它都是这样工作的。您可以在.catchfunctionerr{some logic here}中定义回调内联,也可以在.catchnext中传递以前定义的函数。这只是简单的Javascript。@myNewAccount-尽可能多的例子:。不知道还能解释什么。