#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, и это сработало. Спасибо!