Ошибка типа выполнения диалогового потока: не удается прочитать свойство «Параметры»

#node.js #firebase #google-cloud-functions #dialogflow-es #dialogflow-es-fulfillment

# #node.js #firebase #google-cloud-функции #диалоговые потоки #dialogflow-es-выполнение

Вопрос:

Здравствуйте, я пытаюсь создать webhook для своей базы данных mysql, и все работало отлично, пока я не попытался добавить параметры.

Я всегда получаю эту ошибку в firebase cloudfunctions

Ошибка типа: не удается прочитать свойство «параметры» неопределенного значения при экспорте.dialogflowFirebaseFulfillment.functions.https.onRequest (/user_code/index.js:17:47) в cloudFunction (/user_code/node_modules/firebase-functions/lib/providers/https.js:57:9) в /var/tmp/worker/worker.js:783:7 в /var/tmp/worker/worker.js:766:11 в _combinedTickCallback (internal/process/next_tick.js:73:7) в процессе._tickDomainCallback (internal/process/next_tick.js:128:9)

он указывает на index.js:17 Вот мой код:

 // See https://github.com/dialogflow/dialogflow-fulfillment-nodejs
// for Dialogflow fulfillment library docs, samples, and to report issues
'use strict';

const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const mysql = require('mysql');
const express = require('express');

const bodypaser = require('body-parser');


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

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
   const parameters = request.body.queryResult.parameters;
   const emailPar = parameters['email'];
   const namePar    = parameters['name'];
  console.log(emailPar);
  console.log(namePar);


  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 welcome(agent) {
    console.log('Inside function welcome');

   return callbackDB().then((rows) =>{
        console.log('inside callabck in welcome function');
        var reply =rows[0].ID;
        var name = rows[0].display_name;
        agent.add(`Welcome to my agent! My ID is: 0`   reply);
        agent.add(`My name is `  name);

   }).catch((error) =>{
        console.log('In catch ERROR::: '  error); 
   });

  }
  function Orders(agent){
    return getOrderCallback().then((rows) =>{
        console.log('inside getOrderCallabck in orders function');
        var id =rows[0].order_id;
        var firstname = rows[0].billing_first_name;
        var lastname = rows[0].billing_last_name;
        var email = rows[0].billing_email;
        var ordereditems =rows[0].order_items;
        var dateorder =rows[0].post_date;
        var billing_address = rows[0].billing_address_1   ' Postcode: '  rows[0].billing_postcode   ' City : '   rows[0].billing_city   ' Country: '   rows[0].billing_state;
        agent.add('Hello there! The current orders made by you are the following: ');
        agent.add(`--Current Orders ---------------------------`);
        agent.add(`Order ID:  `  id);
        agent.add('For : '   firstname   ' '   lastname);
        agent.add(`Contact: `   email);
        agent.add(`Shipping Address: `   billing_address);
        agent.add(`Order placed on :`   dateorder);
        agent.add(`Ordered Items : `   ordereditems);

   }).catch((error) =>{
        console.log('In catch ERROR::: '  error); 
   });
  }
  function fallback(agent) {
    console.log('Inside function fallback');
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
  }


  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('GetOrdersByEmailAndName', Orders);
  // intentMap.set('your intent name here', yourFunctionHandler);
  // intentMap.set('your intent name here', googleAssistantHandler);
  agent.handleRequest(intentMap);

  function getOrderCallback(){
    return new Promise((resolve,reject) =>{
        console.log('Inside getOrderCallback');
      try {
        var mysqlConnection = mysql.createConnection({
            host:'xxxx',
            user:'xxxxxxxxxxxxxxx',
            password:'xxxxxxxxx',
            database:'xxxxxxxxxxxxx',});

        mysqlConnection.connect((err)=>{
            if(!err){
                console.log('DB connection succeeded.');
                console.log('passed parameters : '  emailPar   ' '   namePar);
                mysqlConnection.query(`select
                                            p.ID as order_id,
                                            p.post_date,
                                            max( CASE WHEN pm.meta_key = '_billing_email' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
                                            max( CASE WHEN pm.meta_key = '_billing_first_name' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_first_name,
                                            max( CASE WHEN pm.meta_key = '_billing_last_name' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_last_name,
                                            max( CASE WHEN pm.meta_key = '_billing_address_1' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_address_1,
                                            max( CASE WHEN pm.meta_key = '_billing_address_2' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_address_2,
                                            max( CASE WHEN pm.meta_key = '_billing_city' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_city,
                                            max( CASE WHEN pm.meta_key = '_billing_state' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_state,
                                            max( CASE WHEN pm.meta_key = '_billing_postcode' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_postcode,
                                            max( CASE WHEN pm.meta_key = '_order_total' and p.ID = pm.post_id THEN pm.meta_value END ) as order_total,
                                            max( CASE WHEN pm.meta_key = '_order_tax' and p.ID = pm.post_id THEN pm.meta_value END ) as order_tax,
                                            max( CASE WHEN pm.meta_key = '_paid_date' and p.ID = pm.post_id THEN pm.meta_value END ) as paid_date,
                                            ( select group_concat( order_item_name separator '|' ) from wp_woocommerce_order_items where order_id = p.ID ) as order_items
                                        from
                                            wp_posts p 
                                            join wp_postmeta pm on p.ID = pm.post_id
                                            join wp_woocommerce_order_items oi on p.ID = oi.order_id
                                        group by
                                            p.ID
                                        HAVING billing_email = ? AND billing_first_name = ?`,[emailPar,namePar],
                 (error,rows,fields)=>{
                    if(!error){
                        console.log(rows);

                        resolve(rows);
                        }
                    else{
                        console.log(error);
                        reject(rows);
                        }
                    });

            }
        else{
            console.log('DB connection failed.');
        }
  });


      }
      catch (err){
        let results = 'error in try-catch';
        console.log(results);
        reject(results);
      }


    });
}


function callbackDB(){
    return new Promise((resolve,reject) =>{
      console.log('Inside callbackDB');

      try {
        var mysqlConnection = mysql.createConnection({
            host:'xxxx',
            user:'xxxxxxxxxxxxxxx',
            password:'xxxxxxxxx',
            database:'xxxxxxxxxxxxx',});
        mysqlConnection.connect((err)=>{
            if(!err){
                console.log('DB connection succeeded.');
                mysqlConnection.query('SELECT * FROM wp_users',(error,rows,fields)=>{
                    if(!error){
                        console.log(rows);
                        resolve(rows);
                        }
                    else{
                        console.log(error);
                        reject(rows);
                        }
                    });

            }
        else{
            console.log('DB connection failed.');
        }
  });


      }
      catch (err){
        let results = 'error in try-catch';
        console.log(results);
        reject(results);
      }

    });

}
});

 

Это означает, что это как-то связано со строкой 17, которая:

const parameters = request.body .QueryResult.parameters;

Но я не понимаю, что я делаю не так

Помощь или совет будут высоко оценены

Комментарии:

1. На первый взгляд, это выглядит так, как будто все должно быть в порядке. Возможно, вы захотите поместить два console.log() вызова перед вашими функциями, чтобы вы могли видеть, как request.body это выглядит. Если у вас все еще возникают проблемы, обновление вашего вопроса с включением содержимого request.body может помочь нам помочь вам.

2. Спасибо за ваш ответ @Prisoner, но перед тем, как вы написали этот комментарий, я потратил дополнительные 40 минут на изучение журналов, и действительно, я нашел решение в request.body . Как ни странно, request.body . QueryResult больше не работает, но на моем другом чат-боте, который использует QueryResult для доступа к параметрам, все еще работает LOL. Итак, решение моей проблемы — изменить его на request.body.result.paramters

Ответ №1:

Из ваших комментариев похоже, что вы используете Dialogflow v1, в котором указаны параметры request.body.result.parameters . В Dialogflow v2 это изменилось на request.body.queryResult.parameters .

Если вы все еще используете Dialogflow v1, вам следует немедленно сменить его, поскольку он скоро больше не будет поддерживаться. Для этого зайдите в настройки в https://console.dialogflow.com / и убедитесь, что у вас установлен API версии v2.

введите описание изображения здесь

Комментарии:

1. 100% правильно, я вернул его в QueryResult, и это сработало. Спасибо!