【问题标题】:Passing argument with dependency injection使用依赖注入传递参数
【发布时间】:2019-04-18 02:24:37
【问题描述】:

我在 unbound.js 中有函数,代码如下

export default async function connect({ mongoose: mongoose }, URI) {
console.log('in connect');
  mongoose.connect(URI);
  mongoose.Promise = global.Promise; 
  });
}

然后我有另一个 index.js 来处理看起来像这样的依赖注入

module.exports = async url => {
  return await require("./unbound").default.bind(
    null,
    {
      mongoose: require("mongoose")
    },
    url
  );
};

我做的与普通依赖注入不同的唯一一件事就是将 URL 作为参数传递。

当我从index.js 调用导出时,我没有得到任何回应。 console.lognot outputing 证实了这一点

关于如何解决这个问题的任何指导?

【问题讨论】:

  • 我认为require('./unbind') 没有提供可调用对象,也就是function。您是否尝试过调试以查看它实际为您提供了什么?
  • 你是对的..我不得不在它后面加上.default。代码已更新.. 但现在函数调用甚至没有进入unbound.js中的代码
  • 在哪里调用新绑定的函数?因为bind 不适合您,您可以尝试在这种情况下使用call
  • 我在 app.js 中使用它在express 服务器开始侦听请求之前建立 mongoDB 连接.. 试过 call()。同样的结果..但我可能犯了一个错误。有sn-ps吗?
  • 对不起,伙计,真的很难知道到底发生了什么,你应该做一个演示。

标签: javascript dependency-injection


【解决方案1】:

由于聊天受到限制,我将在此处发布答案。 在这个 sn-p 中,您导出一个 function,当调用它时,返回另一个 function

 module.exports = async url => {
  return await require("./unbound").default.bind(
    null,
    {
      mongoose: require("mongoose")
    },
    url
  );
};

所以如果你想实际运行它,你必须像require('./')()()一样调用它两次

【讨论】:

    【解决方案2】:

    正如其他人所建议的那样,bind 返回一个您可以调用的绑定函数,它实际上并不调用该函数——这就是 .apply 或 .call 所做的。 @ptdien 的解决方案有些正确,但它不起作用,因为您忘记返回 mongoose.connect 返回的承诺,因此您的连接函数返回未定义,因此调用者无需等待。 IE。你需要这样做:

    export default function connect({ mongoose: mongoose }, url) {
      mongoose.Promise = global.Promise; 
      return mongoose.connect(url);
    }

    (另请注意,我已经删除了 async 关键字,因为当我们不使用 await 时,这不是必需的 - 代码已经返回了一个 Promise。

    另外,bind 会在绑定的参数(即本例中的 url)之后自动转发参数,因此您可以将代码简化为:

    module.exports = require("./unbound").default.bind(
        null,
        {
          mongoose: require("mongoose")
        }
    );

    顺便说一句,您必须附加 .default 的原因是因为您混合了 node.js 要求和 ES6 导入。选择一个并坚持下去。

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多