Node.js 实现此服务/控制器模式的最佳方式是什么?

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 =>

在我的nodejs/expressrestapi中,我使用服务/控制器模式。 在服务中,我呼叫mongodb。我希望在服务中发生错误处理/抛出,但我不希望同时调用
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));
    });
}