【问题标题】:IBM Action not returning anything after GET requestIBM Action 在 GET 请求后未返回任何内容
【发布时间】:2019-05-10 09:03:09
【问题描述】:

首先,我是 Javascript 的初学者,所以如果我的信息中有任何不确定或不明确之处,请随时纠正我。

我尝试创建一个操作来支持我的 IBM Watson Assistant。一旦被调用,该操作应该从 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};  
}

我期待“返回”操作后的答案,但它只显示空值。我很确定该操作永远不会进入“http.get”部分。当我删除 // 并调用代码时,它返回以下消息:“dataToSend 未定义”;如果我保持代码原样(带有注释),则不会弹出错误。

omdapi 是免费的,但托管在美国,以防万一。

有什么想法吗?无论如何,提前致谢。

【问题讨论】:

    标签: node.js get ibm-watson watson-assistant


    【解决方案1】:

    认为您会发现您的 ibm 函数在您对 omdbapi 的外部调用返回之前完成。你最好的选择是使用 Promise(作为新手,我希望你可能还没有使用过 Promise - 建议阅读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);
             });
         });
      });
    }
    

    【讨论】:

    • 嗨@timd,感谢您的反馈!它现在可以工作了,在玩了一些之后:) 你知道我是否也可以用卡片回答吗?
    • 抱歉,我不明白您所说的卡片是什么意思? - 仅在 Alexa 回复中出现。如果您指的是图像,那么您可以将图像 url 传回(如果它是公开的)。
    • 我在谈论类似w3schools.com/howto/howto_css_cards.asp 但我找到了实现它的方法,所以谢谢!
    • 感谢您的链接,现在了解您的要求。您可以将其设置为操作负载的一部分(并在操作内构建),或者使用返回的操作负载(响应文本包括 html + $returned_response.json_element 等)构建为后续对话响应的一部分。或在您的客户端应用程序中。
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多