Try catch 块没有捕获 node.js 中的错误

Try catch block doesn`t catch error in node.js

class AuthController {
    static methods = {
        GET: {
            '/auth/signup': {
                func: AuthService.signUp,
                response: (data, res) => {
                    res.statusCode = 200;
                    res.end(JSON.stringify(data));
                },
            },
        },
    };

    static use(req, res) {
        const route = this.methods[req.method][req.url];
        if (!route) {
            res.statusCode = 404;
            res.end(JSON.stringify({ message: 'Not found 404!' }));
            return;
        }
        try {
            const data = JSON.parse(req?.body?.data || '{}');
            const result = route.func({ ...data });
            route.response(result, res);
        } catch (err) {
            console.log(err, 'here');
            res.statusCode = err.statusCode || 500;
            res.end(JSON.stringify(err.message));
        }
    }
}


class AuthService {
    static async signUp({ login, password }) {
        if (!login || !password) throw new BaseError(400, 'kl', 'Custom error');
     }
}
   

它在控制台中显示错误,但 try catch 块看不到它。 Here is the traceback。 我不知道是什么原因,因为抛出错误的函数在块内部。请帮忙!

我看到一个问题。您已将 signUp() 声明为 async。这意味着它总是 returns 一个承诺,并且它意味着它内部的任何 throw 操作都会拒绝它 returns 的承诺(异常不会同步传播)。但是,当您尝试在此处调用它时:

 const result = route.func({ ...data });

你没有 await 它所以当 signUp() 拒绝时,承诺进入 result,但没有人处理承诺被拒绝的事实,你得到 UnhandlePromiseRejectionWarning来自系统。

我看不到(所有其他路线的)整体设计,但也许您只需要添加 await 到此:

 const result = await route.func({ ...data });

而且,你必须让 .use() 也成为 async


或者,如果 signUp() 实际上不需要是 async,那么只需从它的声明中删除 async 并且 throw 将是同步的(而不是变成被拒绝的承诺)然后你的 try/catch 会抓住它。

您附加的回溯会告诉您确切的问题是什么以及您需要做什么:

This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch()

您无法捕获异步函数抛出的异常,该函数在该函数外部带有 try..catch 块,因为脚本执行在异步执行完成之前到达 catch 块。因此,您必须改用 .catch(..)

const result = route.func({ ...data }).catch((err) => {
    console.log("catched error: ", err);
});