Данные диалога для намерения - PullRequest
0 голосов
/ 04 декабря 2018

Намерение в вопросе

Ошибка, которую я получаю Это единственная ошибка, которую я получаю, и она регистрируется в firebase.Это не говорит мне много, поэтому я послал скриншот ошибки, которую я получаю.

Error: Query.once failed: First argument must be a valid event type = "value", "child_added", "child_removed", "child_changed", or "child_moved".
    at validateEventType (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/index.node.cjs.js:1593:19)
    at Reference.Query.once (/user_code/node_modules/firebase-admin/node_modules/@firebase/database/dist/index.node.cjs.js:4825:9)
    at This (/user_code/index.js:40:5)
    at WebhookClient.handleRequest (/user_code/node_modules/dialogflow-fulfillment/src/dialogflow-fulfillment.js:303:44)
    at exports.dialogflowFirebaseFulfillment.functions.https.onRequest (/user_code/index.js:88:9)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:57:9)
    at /var/tmp/worker/worker.js:724:7
    at /var/tmp/worker/worker.js:707:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)

Тело запроса

Тело запроса диалога:

{
  "responseId": "6c61001c-7b4c-4d1d-9790-6774dde5a821",
  "queryResult": {
    "queryText": "what is the number",
    "action": "This",
    "parameters": {
      "number": "number"
    },
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/bot-tmnvld/agent/intents/0f19a151-afbb-4c28-b948-ced1f3b56d6e",
      "displayName": "This"
    },
    "intentDetectionConfidence": 1,
    "languageCode": "en-us"
  },
  "originalDetectIntentRequest": {
    "source": "GOOGLE_TELEPHONY",
    "payload": {
      "telephony": {
        "caller_id": "REDACTED_IN_STANDARD_TIER_AGENT"
      }
    }
  },
  "session": "projects/bot-tmnvld/agent/sessions/doP4-dClQBiAl_WDixhMkg",
  "alternativeQueryResults": [
    {
      "queryText": "what is the number",
      "languageCode": "en-us"
    }
  ]
}

Код:

'use strict';

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

const firebase = require("firebase-admin");

//const serviceAccount = require("path/to/serviceAccountKey.json");
firebase.initializeApp();

process.env.GCLOUD_PROJECT;
process.env.FIREBASE_CONFIG;
process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

 function Data(agent){
     const allParam = agent.parameters.all;
     const all = allParam.replace(/\+/g, "").replace(/-/g,'').replace(/ /g,'');

     //agent.add(number + number + number);
     return firebase.database().ref('/all').push({all: all}).then((snapshot) => {
     console.log('database write successful: ' + snapshot.ref.toString());
 });
}

Функция This (agent) {

 const db = firebase.database();
 const ref = db.ref("my/database/my/data");
  return ref.once("value") 
 .then( snapshot => {
  console.log(snapshot.val());
    // Don't forget to return something to Dialogflow

}, 
ref.once('unhandledRejection', err => {
    console.log('Unhandled rejection:', err);

}));
}


  let intentMap = new Map();
  //intentMap.set('Default Intent', welcome);
 // intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('Data', Data);
  intentMap.set('This', This);

  agent.handleRequest(intentMap);
});

1 Ответ

0 голосов
/ 04 декабря 2018

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

  let intentMap = new Map();
  intentMap.set('IntentName', intentHandler);
  agent.handleRequest(intentMap);

Похоже, вам нужно добавить такойстрока для этой функции.

Однако у вашего обработчика также есть другие проблемы:

  • Поскольку вы выполняете асинхронную функцию (она имеет обратные вызовы), вам необходимо вернуть Promise.
  • Вы также используете функцию on(), когда функция once(), вероятно, более уместна (вы не хотите получать обновления - вам нужен только один снимок данных).
  • Я также не уверен, почему вы используете "/ all" в качестве первого параметра для on(), поскольку предполагается, что это тип события, и обычно вы используете тип "value",Поэтому я не уверен, что вы думаете, что он должен делать.

К счастью, команда once() возвращает Promise, если вы не используете обратные вызовы.Что-то вроде этого может быть больше, чем вы хотите, но трудно сказать:

return ref.once("value")
  .then( snapshot => {
    console.log(snapshot.val());
    // Don't forget to return something to Dialogflow
  })
  .catch( err => {
    console.log(err);
    // Dialogflow should say something went wrong
  });

Обновление : в сообщении об ошибке, которое вы только что опубликовали, важная строка -

Ошибка Query.once: первый аргумент должен быть допустимым типом события = "value", "child_added", "child_removed", "child_changed" или "child_moved".

Theкод, который вы опубликовали в данный момент, не выглядит синтаксически правильным, но эта строка определенно неверна:

ref.once('unhandledRejection', err => {
    console.log('Unhandled rejection:', err);

})

Я не уверен, что это должно делать (это блок .catch()?) но, как показывает ошибка, вы почти наверняка хотите, чтобы ваш вызов на ref.once() был ref.once('value'), как я показал в моем коде выше.

...