Node.js 实现此服务/控制器模式的最佳方式是什么?
在我的nodejs/expressrestapi中,我使用服务/控制器模式。 在服务中,我呼叫mongodb。我希望在服务中发生错误处理/抛出,但我不希望同时调用Node.js 实现此服务/控制器模式的最佳方式是什么?,node.js,express,asynchronous,promise,Node.js,Express,Asynchronous,Promise,在我的nodejs/expressrestapi中,我使用服务/控制器模式。 在服务中,我呼叫mongodb。我希望在服务中发生错误处理/抛出,但我不希望同时调用User.find()两次 controller.js exports.findAll = (req, res, next) => { userService.findAllUsers() .then(users => res.json(users)) .catch(err =>
User.find()
两次
controller.js
exports.findAll = (req, res, next) => {
userService.findAllUsers()
.then(users => res.json(users))
.catch(err => next(err));
};
service.js
async function findAllUsers() {
if(await User.find()) {
return await User.find()
} else {
throw "Couldn't retrieve all users"
}
}
如果
User.find()
失败,我如何重写服务函数才能抛出错误?只需将其存储在变量中:
async function findAllUsers() {
let users = await User.find();
if(users) {
return users;
} else {
throw "Couldn't retrieve all users"
}
}
使用试捕
使用以下内容:
有关更多参考信息,请克隆此回购:谢谢!但如果
User.find()
失败,这不会导致未经处理的承诺被拒绝吗?我只是按照您最初的逻辑。在您的原始逻辑中,您没有try/catch块,因此这与您的原始代码具有完全相同的含义。如果您想要捕获错误,您可以添加try/catch块,但您仍在抛出错误,因此我不理解您对承诺拒绝失败的抱怨,因为您的抛出也将导致承诺拒绝如果没有错误,则失败。此外,您已经在处理.catch(err=>next(err))
中的承诺错误。问题是.catch(err=>next(err))
中的错误是由api直接返回的。我不希望mongoose错误被我的api吐出来,而是捕获mongoose错误并抛出一个带有自定义的、用户友好的错误消息的新错误。这会更改原始代码的逻辑。它将是1。不将null返回值作为错误和2处理。打断他的.catch()
async function findAllUsers() {
try {
return await User.find();
} catch(error) {
return error;
}
}
// # service.js
async function findAllUsers() {
// # return with new promise.
return new Promise((resolve, reject) => {
return await User.find().then(user => resolve(user)).error(er => reject(er));
});
}