gpt4 book ai didi

javascript - Koa-异步函数错误处理内的异步函数

转载 作者:行者123 更新时间:2023-12-03 08:17:57 24 4
gpt4 key购买 nike

在我的app.js中,我有以下内容...

app.use(async (ctx, next) => {
try {
await next()
} catch (err) {
ctx.status = 400
ctx.body = `Uh-oh: ${err.message}`
console.log('Error handler:', err.message)
}
});

app.use(router());
然后在 routes中我定义了...
router.post('/', retrieve);
检索逻辑的结构如下:
const retrieve = async ctx => {
Object.keys(ctx.request.files).forEach((key) => {
process(files[key]);
});
};
现在假设我在 retrieve中抛出了一个错误...
const retrieve = async ctx => {
throw new Error(`Error!`);
Object.keys(ctx.request.files).forEach((key) => {
process(files[key]);
});
};
这将正常工作,并一直扩展到 app.js。但是, process函数也使用 async,如果我在那儿抛出错误……
const retrieve = async ctx => {
Object.keys(ctx.request.files).forEach((key) => {
process(files[key]);
});
};

const process = async (file) => {
throw new Error(`Error!`);
...
我收到以下错误...

UnhandledPromiseRejectionWarning: Error: Error!


为什么我收到 UnhandledPromiseRejectionWarning?我该如何修复它并使它产生,以便 process内引发的任何错误都冒泡到 app.js

最佳答案

由于forEach循环不是异步的,因此错误在执行后会抛出,因此无法冒泡至app.js。现在有两种解决方案,您可以使用for循环,也可以映射 promise 并等待所有 promise 解决。根据您的问题的示例代码:

  • 用于顺序调用process
  • const retrieve = async ctx => {
    const ctxKeys = Object.keys(ctx.request.files);
    for(let i = 0 ; i < ctxKeys.length ;++i){
    await process(files[ctxKeys[i]]);
    }
    };

  • 用于异步调用process
  • const retrieve = async ctx => {
    await Promise.all(Object.keys(ctx.request.files).map(async (key) => {
    await process(files[key]);
    }));
    };

    关于javascript - Koa-异步函数错误处理内的异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63665020/

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