Невозможно прочитать свойство неопределенного при доступе к собственному API - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь использовать свой собственный express.js API с nodejs.Проблема в том, что это работает, но выдает ошибку, и я не могу получить доступ к результату петиции.Это мой код:

rout.js:

app.post('/petition/:id', function(req, res) {
    console.log("ID: ", req.params.id);
    if (!req.params.id) {
        return res.send({"status": "error", "message": "Chooser id needed"});
    }
    else {
        indicoUtils.indicoPositivosNegativos(req.params.id).then(function(result) {
            return res.send({"result": result});
        })
    }
})

calculator.js:

var indicoPositivosNegativos = function (chooserId) {
    var TweetModel = mongoose.model('Tweet'.concat(chooserId), Tweet.tweetSchema);
    TweetModel.find({},{ _id: 1, tweet: 1}).then(tweets =>
        Promise.all(
            tweets.map(({ _id, tweet }) =>
                indico.sentiment(tweet).then(result =>
                    TweetModel.findOneAndUpdate({ _id }, { indicoPositivoNegativo: result }, { new: true })
                        .then( updated => { console.log(updated); return updated })
                )
            )
        )
    )
};

Я проверяю это с почтальоном, и он показывает ошибку:

Ошибка типа: невозможно прочитать свойство .then of undefined

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Это в основном означает, что один из объектов, которые вы пытаетесь вызвать функцией .then, не определен.

В частности, объект indicoUtils.indicoPositivosNegativos (req.params.id) должен быть обещанием, но ваша функция indicoPositivosNegativos не возвращает обещание.На самом деле ваша функция ничего не возвращает, поэтому .then вызывается с неопределенным значением.

Решение простое, вы должны добавить инструкцию return в calculator.js, чтобы вернуть обещание, подобное этому:

var indicoPositivosNegativos = function (chooserId) {
    var TweetModel = mongoose.model('Tweet'.concat(chooserId), Tweet.tweetSchema);
    return TweetModel.find({},{ _id: 1, tweet: 1}).then(tweets =>
        Promise.all(
            tweets.map(({ _id, tweet }) =>
                indico.sentiment(tweet).then(result =>
                    TweetModel.findOneAndUpdate({ _id }, { indicoPositivoNegativo: result }, { new: true })
                        .then( updated => { console.log(updated); return updated })
                )
            )
        )
    )
};
0 голосов
/ 05 июня 2018

Обещание, созданное TweetModel.find, не возвращается вызывающей функции из обработчика маршрута.

var indicoPositivosNegativos = function(chooserId) {
  var TweetModel = mongoose.model('Tweet'.concat(chooserId), Tweet.tweetSchema);
  // THE PROMISE NEEDS TO BE RETURNED FOR CALLING FUNCTIONS
  // TO HAVE ACCESS TO IT.
  return TweetModel.find({}, { 
    _id: 1,
    tweet: 1
  }).then(tweets =>
    Promise.all(
      tweets.map(({
          _id,
          tweet
        }) =>
        indico.sentiment(tweet).then(result =>
          TweetModel.findOneAndUpdate({
            _id
          }, {
            indicoPositivoNegativo: result
          }, {
            new: true
          })
          .then(updated => {
            console.log(updated);
            return updated
          })
        )
      )
    )
  )
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...