假设我有一个函数,我正在从数据库中获取一些数据。
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 };
});
}
提前感谢!
大多数数据库 API 不支持同时支持回调和承诺。 如果您传递回调,它们不会返回承诺。 选择一种样式或另一种样式。 您使用.then()
的第一种方法效果很好,因为这都是基于承诺的。
第二种方法不起作用,因为您正在传递常规回调。 这告诉数据库不要返回承诺,因为您使用的是较旧的回调样式,但您正在尝试使用该承诺。
如果你想使用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 };
}
}
仅供参考,您可以从第一个代码块中删除.catch()
处理程序中的if (err)
测试。 如果触发.catch()
,则会出现错误 - 您无需测试是否存在错误。