【问题标题】:Why is this async handler error catching is different from normal try catch block?为什么这个异步处理程序错误捕获与正常的 try catch 块不同?
【发布时间】:2021-12-12 15:37:05
【问题描述】:

当我尝试按照教程进行操作时。他正在使用一个名为 express-async-handler 的库来自动处理异步函数

Link to github npm

问题是我尝试在不使用库的情况下将该代码转换为普通代码,但我发现有些不同。

这是带有 asyncHandler 的代码

router.get('/', asyncHandler(async (req, res) => {
    const products = await Product.find({});
    throw new Error('Error')
    res.json(products);
}))

如您所见,路由出现错误。使用 asyncHandler 时,请求状态会在抛出错误时由中间件更改为 500

const errorHandler = (err, req, res, next) => {
    const statusCode = res.statusCode === 200 ? 500 : res.statusCode
    res.status(statusCode)
    res.json({
        message: err.message,
    })
}

但是当我尝试使用普通的trycatch block时,error handler middleware没有检测到throw

router.get("/", async (req, res) => {
try {
    const products = await Product.find({});
    throw new Error('Something went wrong!');
    res.json(products);
} catch (err) {
    res.json({ message: err });
}
});

那么代码之间有什么区别,据我了解,我转换的代码是正确的。有什么问题吗?

【问题讨论】:

    标签: node.js express asynchronous


    【解决方案1】:

    问题是您没有调用 next 函数并出现错误。现在,您发现了错误,只需在响应中设置 json

    这意味着这个函数之外的任何人都不知道这个错误,因为它已经被完全处理了!

    看看以下内容是否能满足您的需求:

    router.get("/", async (req, res, next) => {
    try {
        const products = await Product.find({});
        throw new Error('Something went wrong!');
        res.json(products);
    } catch (err) {
        next(err)
    }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 2010-09-07
      • 2021-07-25
      相关资源
      最近更新 更多