web-dev-qa-db-fra.com

L'appel du webhook Dialogflow Fulfillment a échoué

enter image description here Je suis nouveau dans la gestion des flux de dialogue et j'essaie de récupérer des nouvelles de l'API d'actualités en fonction des questions des utilisateurs. J'ai suivi la documentation fournie par l'API de nouvelles, mais je ne suis pas en mesure d'attraper les réponses des résultats de la recherche, lorsque j'exécute la fonction dans la console, ce ne sont pas des erreurs. J'ai changé le code et il semble que maintenant il atteint le point de terminaison newsapi mais il ne récupère aucun résultat. J'utilise https://newsapi.org/docs/client-libraries/node-js pour faire une demande de recherche sur tout ce qui concerne le sujet. lorsque je diagnostique la fonction, il indique "L'appel Webhook a échoué. Erreur: NON DISPONIBLE."

'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);
       
                       }
   });  
  

}

Voici également la réponse de l'API RAW

{
  "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": {}
    }
  }
} 

Et voici la demande de traitement:

{
  "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": {}
    }
  }
}

Voici également la capture d'écran de la console Firebase. enter image description here

Quelqu'un peut-il me guider sur ce qui me manque ici?

2
Sachin

La clé est les trois premières lignes du message d'erreur:

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'

Cela signifie que le module newsapi n'a pas pu être chargé et que la cause la plus probable de ceci est que vous ne l'avez pas répertorié comme une dépendance dans votre fichier package.json.

Si vous utilisez l'éditeur en ligne de Dialogflow, vous devez sélectionner l'onglet package.json Et ajouter une ligne dans la section dependencies.

Inline Editor

Mise à jour

On ne sait pas exactement quand et où vous obtenez l'erreur "NON DISPONIBLE", mais une cause probable si vous utilisez l'éditeur en ligne de Dialogflow est qu'il utilise le plan tarifaire Firebase "Spark", qui a des limites sur les appels réseau en dehors du réseau de Google.

Vous pouvez passer au plan Blaze , qui nécessite une carte de crédit enregistrée, mais inclut le niveau gratuit du plan Spark plan, donc vous ne devriez pas encourir de frais lors d'une utilisation légère. Cela permettra les appels réseau.

Mise à jour basée sur TypeError: Cannot read property '0' of undefined

Cela indique qu'une propriété (ou éventuellement un index d'une propriété) tente de faire référence à quelque chose qui n'est pas défini.

On ne sait pas exactement quelle ligne cela peut être, mais ces lignes sont toutes suspectes:

    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];

puisqu'ils font tous référence à une propriété. Je vérifierais pour voir exactement ce qui revient et est stocké dans response. Par exemple, se pourrait-il qu'il n'y ait pas de champ "données" ou "auteur" dans ce qui est renvoyé?

En regardant https://newsapi.org/docs/endpoints/everything , il semble qu'aucun de ces n'est champs, mais qu'il y a une propriété articles renvoyée qui contient un tableau d'articles. Vous voudrez peut-être l'indexer et obtenir les attributs que vous souhaitez.

Mise à jour

Cela ressemble à ça, même si vous chargez le paramètre dans une variable avec cette ligne

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

Vous n'utilisez en fait la variable search nulle part. Au lieu de cela, vous semblez passer une chaîne littérale "recherche" à votre fonction avec cette ligne

callNewsApi('search').then((output) => {

qui fait une recherche pour le mot "recherche", je suppose.

Vous avez indiqué que "cela va à la partie catch", ce qui indique que quelque chose s'est mal passé dans l'appel. Vous ne montrez aucune journalisation dans la partie catch, et il peut être utile de journaliser l'exception qui est levée, afin que vous sachiez pourquoi ça va à la partie de capture. Quelque chose comme

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

est normal, mais comme il semble que vous le consignez dans la partie .on('error'), montrer cette erreur peut être utile.

2
Prisoner

Le nom de l'intention et la variable que j'utilisais pour passer l'appel avaient une différence dans la casse, je suppose que les appels sont sensibles à la casse, soyez conscient de cela

0
jack.the.ripper