假设我有一个函数,可以从数据库中获取一些数据。
findById(id) {
return Model.findById(id)
}
我需要这样重组user data
的退货:
{
name: "Tom",
age: 57
}
变成这样:
{
message: "User is found successfully",
success: true,
user: user
}
到目前为止,我可以通过Promise "then"
部分来进行管理,如下所示:
return Model.findById(id)
.then(user => {
if (!user) {
logger.warn(`Coundn't find user with id: ${id}`);
return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
}
return { message: `User with id: ${id}`, success: true, user: user };
})
.catch(err => {
if (err) {
logger.error(err.message);
return { message: err.message, success: false, user: null };
}
})
我可以对async/await
进行同样的操作,然后返回重新组合的报酬吗?
因为到目前为止,它从数据库返回了user object
:
async findById(id) {
return await this.model.findById(id, function (user, err) {
if (err) {
console.log('test');
logger.error(err);
return { message: err.message, success: false, user: null };
}
if (!user) {
logger.warn(`Coundn't find user with id: ${id}`);
return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
}
return { message: `User with id: ${id}`, success: true, user: user };
});
}
提前谢谢!
答案 0 :(得分:5)
大多数数据库API不同时支持回调和Promise。如果传递回调,则它们不会返回承诺。选择一种或另一种。您使用.then()
的第一种方法就很好用,因为这都是基于promise的。
您的第二种方法不起作用,因为您要传递常规回调。这告诉数据库不要返回承诺,因为您使用的是较早的回调样式,但是您尝试使用该承诺。
如果您想使用async/await
,可以这样做:
async findById(id) {
try {
let user = await this.model.findById(id);
if (user) {
return { message: `User with id: ${id}`, success: true, user: user };
} else {
logger.warn(`Coundn't find user with id: ${id}`);
return { message: `Coundn't find user with id: ${id}`, success: false, user: null };
}
} catch(e) {
logger.error(err);
return { message: err.message, success: false, user: null };
}
}
仅供参考,您可以从第一个代码块中的if (err)
处理程序中删除.catch()
测试。如果.catch()
被触发,则会出现错误-您无需测试其中是否存在。