【问题标题】:Whats the best way to implement this service/controller pattern?实现此服务/控制器模式的最佳方法是什么?
【发布时间】:2020-01-15 06:14:58
【问题描述】:

在我的 nodejs/express rest api 中使用服务/控制器模式。 在我调用 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() 失败,我将如何重写服务函数才能引发错误?

【问题讨论】:

    标签: node.js express asynchronous promise


    【解决方案1】:

    只需将其存储在一个变量中:

    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 块,但无论如何你都会抛出一个错误,所以我不明白你对承诺拒绝失败的抱怨,因为你的 throw 也会导致如果没有被捕获,则承诺拒绝失败
    • 此外,您已经在处理 .catch(err => next(err)) 中的 promise 错误
    • 问题是.catch(err => next(err))中的错误是api直接返回的。我不希望我的 api 吐出 mongoose 错误,而是捕获 mongoose 错误并使用自定义、用户友好的错误消息抛出一个新错误
    【解决方案2】:

    使用try catch

    async function findAllUsers() {
        try {
            return await User.find();
        } catch(error) {
            return error;
        }
    }
    

    【讨论】:

    • 这改变了原始代码的逻辑。它将 1. 不处理 null 返回值作为错误和 2. 打破他的.catch()
    【解决方案3】:

    使用以下内容:

    // # 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));
        });
    }
    

    如需更多参考,请克隆此仓库:https://github.com/sagormax/node-admin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 2010-11-19
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2021-06-06
      相关资源
      最近更新 更多