Передача аргумента с внедрением зависимости - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть функция в 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 голосов
/ 16 ноября 2018

Как уже предлагали другие, 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 - код уже возвращает обещание.

Кроме того, bind будет автоматически пересылать аргументы после связанных (т. Е. URL в этом случае), так что вы можете упростить свой код до следующего:

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

Кстати, причина, по которой вы должны добавить .default, заключается в том, что вы смешиваете node.js, требует и ES6 импортирует. Выберите один и придерживайтесь его.

0 голосов
/ 15 ноября 2018

Поскольку чат ограничен, я выложу ответ здесь.В этом фрагменте вы экспортируете function, который при вызове возвращает другое function

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

Так что, если вы хотите запустить его на самом деле, вы должны вызвать его дважды, например require('./')()(), например

...