web-dev-qa-db-ja.com

DialogflowフルフィルメントWebhook呼び出しが失敗しました

enter image description here Dialogflowフルフィルメントは初めてで、ユーザーの質問に基づいてニュースAPIからニュースを取得しようとしています。ニュースAPIが提供するドキュメントをフォローしましたが、コンソールで関数を実行してもエラーではないため、検索結果からの応答をキャッチできません。コードを変更したところ、newsapiエンドポイントに到達しているように見えますが、結果を取得していません。 https://newsapi.org/docs/client-libraries/node-js を使用して、トピックに関するすべての検索をリクエストしています。関数を診断すると、「Webhookの呼び出しに失敗しました。エラー:使用できません。」

'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const http = require('http');


const Host = 'newsapi.org';
const NewsAPI = require('newsapi');
const newsapi = new NewsAPI('63756dc5caca424fb3d0343406295021');

process.env.DEBUG = 'dialogflow:debug';

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((req, res) =>
{
  // Get the city 
  let search = req.body.queryResult.parameters['search'];// search is a required param
  

  // Call the weather API
  callNewsApi(search).then((response) => {
    res.json({ 'fulfillmentText': response }); // Return the results of the news API to Dialogflow
  }).catch((xx) => {
    console.error(xx);
    res.json({ 'fulfillmentText': `I don't know the news but I hope it's good!` });
  });
});

function callNewsApi(search) 
{
  console.log(search);
  newsapi.v2.everything
  (
    { 
        q: 'search',
        langauge: 'en',
        sortBy: 'relevancy',
        source: 'cbc-news',
        domains: 'cbc.ca',
        from: '2019-12-31',
        to: '2020-12-12',
        page: 2
    }
  ).then (response => {console.log(response);
                       {                               

                      
     let articles = response['data']['articles'][0];
                      

        // Create response
        
let responce = `Current news in the $search with following title is  ${articles['titile']} which says that 
        ${articles['description']}`;

        // Resolve the promise with the output text
        console.log(output);
       
                       }
   });  
  

}

こちらもRAW APIレスポンスです

{
  "responseId": "a871b8d2-16f2-4873-a5d1-b907a07adb9a-b4ef8d5f",
  "queryResult": {
    "queryText": "what is the latest news about toronto",
    "parameters": {
      "search": [
        "toronto"
      ]
    },
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/misty-ktsarh/agent/intents/b52c5774-e5b7-494a-8f4c-f783ebae558b",
      "displayName": "misty.news"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {
      "webhook_latency_ms": 543
    },
    "languageCode": "en"
  },
  "webhookStatus": {
    "code": 14,
    "message": "Webhook call failed. Error: UNAVAILABLE."
  },
  "outputAudio": "UklGRlQqAABXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAAZGF0YTAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA... (The content is truncated. Click `COPY` for the original JSON.)",
  "outputAudioConfig": {
    "audioEncoding": "OUTPUT_AUDIO_ENCODING_LINEAR_16",
    "synthesizeSpeechConfig": {
      "speakingRate": 1,
      "voice": {}
    }
  }
} 

そしてここに履行要求があります:

{
  "responseId": "a871b8d2-16f2-4873-a5d1-b907a07adb9a-b4ef8d5f",
  "queryResult": {
    "queryText": "what is the latest news about toronto",
    "parameters": {
      "search": [
        "toronto"
      ]
    },
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/misty-ktsarh/agent/intents/b52c5774-e5b7-494a-8f4c-f783ebae558b",
      "displayName": "misty.news"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {
      "webhook_latency_ms": 543
    },
    "languageCode": "en"
  },
  "webhookStatus": {
    "code": 14,
    "message": "Webhook call failed. Error: UNAVAILABLE."
  },
  "outputAudio": "UklGRlQqAABXQVZFZm10IBAAAAABAAEAwF0AAIC7AAACABAAZGF0YTAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA... (The content is truncated. Click `COPY` for the original JSON.)",
  "outputAudioConfig": {
    "audioEncoding": "OUTPUT_AUDIO_ENCODING_LINEAR_16",
    "synthesizeSpeechConfig": {
      "speakingRate": 1,
      "voice": {}
    }
  }
}

また、Firebaseコンソールのスクリーンショットもここにあります。 enter image description here

私がここで欠けているものを誰かが私に案内できますか?

2
Sachin

キーは、エラーメッセージの最初の3行です。

_Function failed on loading user code. Error message: Code in file index.js can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'newsapi'
_

これは、newsapiモジュールをロードできなかったことと、これを_package.json_ファイルに依存関係としてリストしなかったことが原因である可能性が高いことを示しています。

Dialogflowインラインエディターを使用している場合は、_package.json_タブを選択し、dependenciesセクションに行を追加する必要があります。

Inline Editor

更新

「UNAVAILABLE」エラーが発生する時期と場所は明確ではありませんが、Dialogflowのインラインエディターを使用している場合、ネットワークコールに制限があるFirebaseの「Spark」料金プランを使用していることが原因の可能性がありますGoogleのネットワーク外。

Blazeプランへのアップグレード には、ファイルにクレジットカードが必要ですが、Sparkプランの無料枠が含まれているため、費用は発生しません。これはネットワーク使用を可能にします。

_TypeError: Cannot read property '0' of undefined_に基づいて更新

これは、プロパティ(またはプロパティのインデックス)が未定義のものを参照しようとしていることを示しています。

正確にはどの行であるかは明確ではありませんが、これらの行はすべて疑わしいものです。

_    let response = JSON.parse(body);
    let source = response['data']['source'][0];
    let id = response['data']['id'][0];
    let name = response['data']['name'][0];
    let author = response['author'][0];
    let title = response['title'][0];
    let description = response['description'][0];
_

それらはすべてプロパティを参照しているためです。何が戻ってきてresponseに格納されるかを正確に確認します。たとえば、送り返されるものに「データ」または「作成者」フィールドがないことが考えられますか?

https://newsapi.org/docs/endpoints/everything を見ると、これらのareフィールドのいずれにも見えません、ただし、記事の配列を含むarticlesプロパティが返送されるということです。あなたはそれを索引付けして、あなたが望む属性を得たいと思うかもしれません。

更新

このようにパラメーターを変数にロードしていますが、

_// Get the city and date from the request
let search = req.body.queryResult.parameters['search'];// city is a required param
_

実際にはsearch変数をどこでも使用しません。代わりに、次の行を使用して、関数にリテラル文字列「search」を渡しているようです

_callNewsApi('search').then((output) => {
_

「検索」という単語の検索を行うと思います。

「キャッチ部分に行く」とのことですが、これはコールで問題が発生したことを示しています。キャッチ部分にはロギングが表示されないため、スローされた例外をログに記録すると役立つ場合があるため、なぜキャッチ部分に。何かのようなもの

_}).catch((xx) => {
  console.error(xx);
  res.json({ 'fulfillmentText': `I don't know the news but I hope it's good!` });
});
_

正常ですが、.on('error')部分でログを記録しているように見えるため、エラーが役立つ場合があります。

2
Prisoner

インテントの名前と、呼び出しを行うために使用していた変数は、Casingで違いがありました。呼び出しでは大文字と小文字が区別されると思います。

0
jack.the.ripper