我在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
未输出
有关如何解决此问题的任何指导?
答案 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导入。选择一个并坚持下去。