【发布时间】:2020-01-31 00:22:49
【问题描述】:
我是 Promises 和 async/await 编程的新手,我不确定我是否理解正确。我正在使用 Express、Mongoose 和 MongoDB 在 Nodejs 中创建 API。 我看过很多关于如何处理异步性的教程,但它们都是关于路由和数据库查询在同一个文件中的 NodeJs 项目。 示例:
const asyncMiddleware = fn =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
router.get('/users/:id', asyncMiddleware(async (req, res, next) => {
const something = await getSomethingFromDb({ id: req.params.id })
res.json(something);
}));
但是,为了清楚起见,我已将路由与控制器分开,但我严重怀疑我是否正确地完成了它。这是我的代码:
router.js
const asyncMiddleware = fn =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
router.get('/something/:id', asyncMiddleware(async (req, res, next) => {
const answer = await somethingController.findById(req, res, next)
}));
controller.js
exports.findById = async (req, res, next) => {
const something = await Something.findById(req.params.id).exec();
res.send(something);
};
我尝试使用 console.log() 来检查打印的内容,但我意识到,由于等待部分,整段代码将等待查询完成。 这实施得好吗?如何测试?
版本: NodeJs v10.16.3 猫鼬 v5.7.1
【问题讨论】:
-
您可以(并且也许应该)将其简化为
router.get('/something/:id', asyncMiddleware(somethingController.findById)); -
如果我这样做,它是否作为异步函数处理?我以为我总是必须在一开始就指定异步函数@Bergi
标签: javascript node.js express mongoose async-await