【问题标题】:Architecture in Node JS wirh Controller, Service and Repository带有控制器、服务和存储库的 Node JS 架构
【发布时间】:2019-12-04 00:15:21
【问题描述】:

为了保持我的 node.js 架构整洁,我有控制器、服务和存储库。

数据流:控制器 -> 服务 -> 存储库 -> 服务 -> 控制器。 在这个流程中(在简单的用户故事中)存储库将数据返回给服务,将服务返回给控制器。但是存储库应该处理对外部存储的请求。

现在我遇到了回调困难,如何在控制器和存储库之间实现嵌套回调?

我的控制器:

exports.clientes_get = async function (req, res) {

    Cliente.find(function(err,params) {
        if (err)
            res.send(err);

            res.json(params);
        });
}

我的服务:

 ClienteGet(req) {
        var response;

        repo.get(req.params.clienteId, (err, res) => {
            response = res;
            //console.log(response); -> have data
        });

        //console.log(response); -> doesnt have data
        return response;
    };

我的仓库:

get(clienteId, data) {
        mongoose.model('Cliente').findById(clienteId, data);
    };

我该怎么做?

【问题讨论】:

    标签: node.js service callback repository domain-driven-design


    【解决方案1】:

    使用回调

    如果你坚持使用回调:

    控制器:

    // notice that the `async` here was not necessary
    exports.clientes_get = function (req, res) {
        // the `function(err, params) {...}` here is your callback
        ClienteGet(req, function(err, params) {
            if (err) {
                return res.send(err);
            }
            res.json(params);
        });
    }
    

    服务:

    ClienteGet(req, callback) {
        // simply pass the callback argument directly to the `repo.get` call
        repo.get(req.params.clienteId, callback);
    };
    

    存储库:

    get(clienteId, callback) {
        // again, just pass the callback here
        mongoose.model('Cliente').findById(clienteId, callback);
    };
    

    使用承诺

    我个人建议将代码包装在 Promises, 因为它们比回调更灵活,而且现代 JavaScript 使用 重承诺。这几乎是新标准......事实上,async / await 语法在底层利用了 Promise。

    以下是如何使用 Promises 的粗略草图:

    控制器:

    exports.clientes_get = function (req, res) {
        return ClienteGet(req)
            .then((data) => {
                res.json(data);
            })
            .catch((err) => {
                res.send(err);
            });
    }
    

    服务:

    ClienteGet(req) {
        return new Promise((resolve, reject) => {
            repo.get(req.params.clienteId, (err, res) => {
                if (err) {
                    return reject(err);
                }
                resolve(res);
                //console.log(response); -> have data
            });
        });
    };
    

    存储库:

    get(clienteId) {
        return new Promise((resolve, reject) => {
            mongoose.model('Cliente').findById(clienteId, function(err, document) {
                if (err) {
                    return reject(err);
                }
                resolve(document);
            });
        });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 2021-07-02
      • 2020-07-07
      • 2011-11-13
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多