Ошибка: нет обработчика для запрошенного намерения в WebhookClient.handleRequest - PullRequest
1 голос
/ 10 апреля 2019

По умолчанию при вызове облачной функции выдается ошибка

Error: No handler for requested intent
at WebhookClient.handleRequest (/user_code/node_modules/dialogflow-fulfillment/src/dialogflow-fulfillment.js:287:29)
at exports.dialogflowFirebaseFulfillment.functions.https.onRequest (/user_code/index.js:73:11)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:57:9)
at /var/tmp/worker/worker.js:783:7
at /var/tmp/worker/worker.js:766:11
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)

как показывает мой веб-ответ в журнале диагностической информации.

             {
              "responseId": "86043a10-8bc2-4ee7-8e8b-1e997289ad7c",
              "queryResult": {
                "queryText": "hi",
                "action": "input.welcome",
                "parameters": {},
                "allRequiredParamsPresent": true,
                "fulfillmentText": "Hi. Am Uma. Kindly let me know your experience facing an issue.",
                "fulfillmentMessages": [
                  {
                    "text": {
                      "text": [
                        "Hi. Am Uma and welcome to support. Kindly let me know your experience facing an issue."
                      ]
                    }
                  }
                ],
                "outputContexts": [
                  {
                    "name": "projects/handymanticketagent/agent/sessions/e416a522-da87-ebd1-348e-9fdea1efbf65/contexts/defaultwelcomeintent-followup",
                    "lifespanCount": 2
                  }
                ],
                "intent": {
                  "name": "projects/handymanticketagent/agent/intents/c58f706f-6cb6-499d-9ce2-459e8054ddc1",
                  "displayName": "Default Welcome Intent"
                },
                "intentDetectionConfidence": 1,
                "diagnosticInfo": {
                  "webhook_latency_ms": 10001
                },
                "languageCode": "en"
              },
              "webhookStatus": {
                "code": 4,
                "message": "Webhook call failed. Error: Request timeout."
              }
            }

Основываясь на ответах о переполнении стека, мы добавили намерение, сопоставленное функции, но все еще получаю ошибку и могу прогрессировать дальше. Где и как консоль облачной функции сообщает, что отсутствует обработчик для моего запроса?

enter image description here

enter image description here

Обновление: как сказал @prisoner, включая мой код облачной функции.

            'use strict';

            const functions = require('firebase-functions');
            const admin = require('firebase-admin');
            const { WebhookClient } = require('dialogflow-fulfillment');

            process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements
            admin.initializeApp(functions.config().firebase);
            const db = admin.firestore();

            exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
                console.log(request.body.queryResult.fulfillmentText);
                console.log(request);
                console.log(response);
                const agent = new WebhookClient({ request, response });
                console.log(agent);
                function writeToDb(agent) {
                    // Get parameter from Dialogflow with the string to add to the database
                    const databaseEntry = agent.parameters.databaseEntry;
                    console.log(databaseEntry);
                    // Get the database collection 'dialogflow' and document 'agent' and store
                    // the document  {entry: "<value of database entry>"} in the 'agent' document
                    const dialogflowAgentRef = db.collection('dialogflow').doc('agent');
                    console.log(dialogflowAgentRef);
                    return db.runTransaction(t => {

                        t.set(dialogflowAgentRef, { entry: databaseEntry });
                        console.log(Promise.resolve('Write complete'));
                        return Promise.resolve('Write complete');
                    }).then(doc => {
                        agent.add('Wrote "${databaseEntry}" to the Firestore database.');
                        return null;
                        }).catch(err => {
                            if (err) {
                                console.log(err.stack);
                            }
                        console.log('Error writing to Firestore: ${err}');
                        agent.add('Failed to write "${databaseEntry}" to the Firestore database.');

                    });
                }

                function readFromDb(agent) {
                    console.log(agent);
                    // Get the database collection 'dialogflow' and document 'agent'
                    const dialogflowAgentDoc = db.collection('dialogflow').doc('agent');
                    console.log(dialogflowAgentDoc);
                    // Get the value of 'entry' in the document and send it to the user
                    return dialogflowAgentDoc.get()
                        .then(doc => {
                            if (!doc.exists) {
                                agent.add('No data found in the database!');
                            } else {
                                agent.add(doc.data().entry);
                            }
                            return Promise.resolve('Read complete');
                        }).catch(() => {
                            agent.add('Error reading entry from the Firestore database.');
                            agent.add('Please add a entry to the database first by saying, "Write <your phrase> to the database"');
                        });
                }
                function defaultwelcomeintent_function(agent) {
                    console.log(agent);
                } 
                // Map from Dialogflow intent names to functions to be run when the intent is matched
                let intentMap = new Map();
                intentMap.set('defaultwelcomeintent-followup', defaultwelcomeintent_function);
                intentMap.set('ReadFromFirestore', readFromDb);
                intentMap.set('WriteToFirestore', writeToDb);
                console.log(intentMap);
                agent.handleRequest(intentMap);
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...