Сделайте вызов API, если значение из mongoDB равно нулю - PullRequest
0 голосов
/ 29 августа 2018

Я занимаюсь разработкой приложения и использую MEAN-стек. У меня есть значения, сохраненные в базе данных, используя MongoDB. Я хочу использовать эти значения для выполнения вызовов API, но только если значение равно нулю. Теперь он успешно получает эти значения из базы данных и выполняет вызовы API, но я не знаю, как проверить, является ли это значение нулевым, я пробовал в основном все, но я думаю, что я не совсем понимаю NodeJS и что это асинхронный Это код, который работает, но не проверяет, является ли значение нулевым:

var makeApiCalls = function (workerId) {
    var Model = mongoose.model('Tweet'.concat(workerId), Tweet.tweetSchema);
    return Model.find({},{ _id: 1, message: 1}).then(messages =>
        Promise.all(
            messages.map(({ _id, message }) =>
                api.sentiment(message).then(result =>
                    Model.findOneAndUpdate({ _id }, { resultOfTheCall: result }, { new: true })
                        .then( updated => { console.log(updated); return updated })
                )
            )
        )
    )
};

Модель mongoose имеет поле под названием resultOfTheCall, и мне нужно проверить, является ли это значение нулевым, и только в этом случае я хочу вызвать API с сообщением поля.

Это console.log одного из сообщений:

{ 
  _id: 5b85c83b413a2b1473e7122a,
  date: 'Tue Aug 28 22:10:02 +0000 2018',
  message: 'la gente quiere y no viene',
  resultOfTheCall: 0.5931016939587707,
  __v: 0 }

1 Ответ

0 голосов
/ 29 августа 2018

Просто отфильтруйте сообщения перед тем, как сделать Promise.all.

var makeApiCalls = function(workerId) {
  var Model = mongoose.model('Tweet'.concat(workerId), Tweet.tweetSchema);
  return Model.find({}, {
    _id: 1,
    message: 1,
    resultOfTheCall: 1
  }).then(messages => {
    // filter the mssages here those for which to make the call and the others
    var toCallArray = messages.filter(x => x.resultOfTheCall == null)
    var noCallArray = messages.filter(x => x.resultOfTheCall != null)
    // now do the calls for only those which do not have resultOfTheCall
    return Promise.all(
      toCallArray.map(({_id, message}) =>
        api.sentiment(message).then(result =>
          Model.findOneAndUpdate({
            _id
          }, {
            resultOfTheCall: result
          }, {
            new: true
          })
          .then(updated => {
            console.log(updated);
            return [...noCallArray, ...toCallArray]
          })
        )
      )
    )
  })
};
...