cho*_*eds 0 javascript mongoose node.js express async-await
我是Promises和async / await编程的新手,但不确定自己是否会理解。我正在使用Express,Mongoose和MongoDB在Node.js中创建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);
}));
Run Code Online (Sandbox Code Playgroud)
但是,为清楚起见,我已将路由与控制器分开,但我严重怀疑是否正确完成了路由。这是我的代码:
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)
}));
Run Code Online (Sandbox Code Playgroud)
controller.js
exports.findById = async (req, res, next) => {
const something = await Something.findById(req.params.id).exec();
res.send(something);
};
Run Code Online (Sandbox Code Playgroud)
我试图用console.log()的东西来检查打印了什么,但是我意识到,由于等待的部分,这整段代码将等待查询完成。这执行得好吗?我该如何测试?
版本:NodeJs v10.16.3猫鼬v5.7.1
首先,您不需要“ asyncMiddleware”。让我举一个完整的示例,说明如何在保持控制器异步的同时分隔路由和控制器:
控制者
exports.findById = async (req, res, next) => {
try{
const something = await Something.findById(req.params.id).exec();
res.send(something);
}catch(err){
return res.status(500).send({
message: err.message
})
}
};
Run Code Online (Sandbox Code Playgroud)
您应该将async
调用包装在try / catch块中。
路线
然后,您只需在路由中调用控制器即可,如下所示:
router.get('/:id', Controller.findByID)
Run Code Online (Sandbox Code Playgroud)
就是这样。您不需要async
在路线上进行任何其他通话。
如果您有要添加路由的中间件,则可以这样做:
//for single middleware
router.get('/:id',somethingMiddle,Controller.findByID)
//for multiple middleware
router.get('/:id',[somethingMiddle, anotherMiddle],Controller.findByID)
Run Code Online (Sandbox Code Playgroud)
让我知道这是否有帮助