我无法理解如何在 Express 中正确编写使用 async/await 的中间件,但在执行后不会让 Promise 漂浮在以太中。我已经阅读了大量的博客和 StackOverflow 帖子,似乎对于在 async/await 中间件中使用以下模式达成了一些共识:
const asyncHandler = fn => (req, res, next) =>
Promise
.resolve(fn(req, res, next))
.catch(next)
app.use(asyncHandler(async (req, res, next) => {
req.user = await User.findUser(req.body.id);
next();
}));
我知道这使得不必在所有 aysnc 路由处理程序中使用 try..catch 逻辑成为可能,并确保 (async (req, res, next) => {}) 返回的 Promise函数已解决,但我的问题是我们从 asyncHandler 的 Promise.resolve() 调用中返回了一个 Promise:
Promise
.resolve(fn(req, res, next))
.catch(next)
并且永远不要在这个返回的 Promise 上调用 then()。使用这种模式是因为我们不依赖中间件函数的任何返回值吗?是否可以只返回 Promises 而从不调用 then() 来获取它们的值,因为 Express 中的中间件没有返回有意义的值?
我知道 async/await 允许我们处理异步代码并轻松处理返回的值,但在 Express 中间件中,我们留下了顶级异步,它解析为 Promise,然后我们使用 Promise.resolve 解析(),但它仍然解析为 Promise...
另外,我知道这个问题有 3rd 方解决方案,你可以使用另一个框架,比如 Koa。我只是想了解如何在 Express 中正确执行此操作,因为我对使用 Node 进行后端开发还比较陌生,并且希望只专注于 Express,直到我掌握了基础知识。
我暂定的解决方案是仅在非中间件函数中使用 async/await,然后在实际中间件中对返回的 Promises 调用 then() ,这样我就可以确定我没有做任何顽皮的事情,例如:
app.use((req, res, next) => {
User.findUser(req.body.id)
.then(user => {
req.user = user;
next();
})
.catch(next)
});
这对我来说很好,但我一直在到处看到 asyncWrapper 代码。我想太多了对吧?
HUWWW
慕勒3428872
开心每一天1111
相关分类