IBM Action ничего не возвращает после запроса GET - PullRequest
0 голосов
/ 10 мая 2019

Прежде всего, я новичок в Javascript, поэтому, если в моем сообщении есть какие-либо неопределенности или неясности, пожалуйста, не стесняйтесь исправлять меня.

Я пытаюсь создать действие для поддержки моего IBM WatsonАссистент.После вызова действие должно получить некоторую информацию из http и дать ответ.

Действие «get» было частью Webhook, успешно развернутого через Heroku в качестве поддержки Dialogflow.Я просто немного его изменил, чтобы облегчить ответ.

function main(req){

    const http = require('http');
    const API_KEY = '85324cac';
    const prodname = req.prodname;
    const reqUrl = encodeURI(`http://www.omdbapi.com/?t=${prodname}&apikey=${API_KEY}`);

    http.get(reqUrl, (responseFromAPI) => {
        let completeResponse = '';

        responseFromAPI.on('data', (chunk) => {
            completeResponse += chunk;
        });

        responseFromAPI.on('end', () => {
            const movie = JSON.parse(completeResponse);
            let dataToSend = prodname ;
            dataToSend += (typeof movie.Title === "undefined") ? `Sorry the film is not in our database` : `${movie.Title} is a ${movie.Actors} starer ${movie.Genre} movie, released in ${movie.Year}. It was directed by ${movie.Director}.`;

            return {answer: dataToSend};
        });
    });
//return {answer: dataToSend};  
}

Я ожидал ответа после действия "return", но он показывает только пустые значения.Я уверен, что действие никогда не попадет в часть "http.get".Когда я удаляю // и вызываю код, он возвращает следующее сообщение: «dataToSend не определен»;если я оставлю код таким, какой он есть (с комментарием), никаких ошибок не появится.

Омдапи бесплатно, но размещается в США, на случай, если это может иметь значение.

Есть идеи?В любом случае заранее спасибо.

1 Ответ

0 голосов
/ 10 мая 2019

Думаю, вы обнаружите, что ваша функция ibm завершается до того, как ваш внешний вызов omdbapi возвращается.Ваш лучший выбор здесь - это использовать обещания (поскольку я новичок, я полагаю, вы, возможно, еще не использовали обещания - рекомендую прочитать https://cloud.ibm.com/docs/openwhisk?topic=cloud-functions-creating-javascript-actions#creating-javascript-actions
Не ваша полная программа, оставьте вам что-нибудь для игры;

function main(req){
  const http = require('http');
  const API_KEY = '85324ca';
//const prodname = req.prodname;
  const prodname = 'Game%20of%20Thrones&Season=1';
  const reqUrl = 'http://www.omdbapi.com/?t=Game%20of%20Thrones&Season=1&apikey=85324cac';
//const reqUrl = encodeURI(`http://www.omdbapi.com/?t=${prodname}&apikey=${API_KEY}`);

return new Promise(function(resolve, reject) {
       http.get(reqUrl, (responseFromAPI) => {
           let completeResponse = '';
           responseFromAPI.on('data', (chunk) => {
               completeResponse += chunk;
               // you could return answer here via resolve.
               //var parsedData = JSON.parse(completeResponse);
               //console.log(parsedData);
               //resolve(parsedData);
           })
           responseFromAPI.on('error', (error) => {
               console.log(error);
               reject(error);
           })
           responseFromAPI.on('end', () => {
               var parsedData = JSON.parse(completeResponse);
               console.log(parsedData);
               resolve(parsedData);
         });
     });
  });
}
...