通过依赖项注入传递参数

时间:2018-11-15 02:52:03

标签: javascript dependency-injection

我在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.log未输出

确认了这一点

有关如何解决此问题的任何指导?

2 个答案:

答案 0 :(得分:1)

由于聊天受到限制,因此我将在此处发布答案。 在此代码段中,您导出一个function,当其被调用时,返回另一个function

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

因此,如果要实际运行它,则必须调用两次,例如require('./')()()

答案 1 :(得分:0)

正如其他人所建议的那样,bind返回一个可以调用的绑定函数,但实际上并没有调用该函数-那是.apply或.call所做的。 @ptdien的解决方案在某种程度上是正确的,但是它无法正常工作,因为您忘记了返回mongoose.connect返回的承诺,因此您的connect函数返回的是undefined,因此没有任何要等待的调用方。即您需要这样做:

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导入。选择一个并坚持下去。