问题
I am creating a chatbot in Dialogflow. I am trying to add the data to the database when its throwing an error of Unhandled Rejection.
This is my index.js file.
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
//const {Card, Suggestion} = require('dialogflow-fulfillment');
var admin = require('firebase-admin');
//require("firebase/firestore");
admin.initializeApp(functions.config().firebase);
var firestore = admin.firestore();
//var db = firebase.firestore();
process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
var addRef = firestore.collection('Admission');
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));
console.log("request.body.queryResult.parameters: ", request.body.queryResult.parameters);
let params = request.body.queryResult.parameters;
/* function welcome (agent) {
agent.add(`Welcome to my agent!`);
} */
/* function fallback (agent) {
agent.add(`I didn't understand`);
agent.add(`I'm sorry, can you try again?`);
} */
let responseJson ={};
function yourFunctionHandler(agent) {
var docRef = firestore.collection('users');
name = request.body.queryResult.parameters['myname'];
coll = request.body.queryResult.parameters['college_name'];
name = name.charAt(0).toUpperCase() + name.slice(1);
let balanceresponse = {};
console.log(name);
return docRef.add({
myname: name,
college: coll
})
.then((querySnapshot)=>{
balanceresponse = {
"fulfillmentText": 'Sure '+name+', Do you want to know about Admissions, Fees, Graduates and PG, Contact information, Media or Testimonials?'
}
console.log('before response.send()');
response.send(balanceresponse);
/* console.log('before response.send()');
response.send({
fulfillmentText:
'Sure '+name+', Do you want to know about Admissions, Fees, Graduates and PG, Contact information, Media or Testimonials?'
//response.json(responseJson);
}); */
console.log('after response.send()');
return 1;
})
.catch(error => {
response.send({
fulfillmentText:
'Something went wrong with the database'
});
});
}
function AdmissionHandler(agent) {
console.log("inside Admission Handler");
let balanceresponse = {};
let Question = request.body.queryResult.parameters['question'];
addRef.where("Question", "==", Question)
.get().then((querySnapshot)=>{
if (querySnapshot) {
console.log("Document data:");
const tips = querySnapshot.docs;
const tipIndex = Math.floor(Math.random() * tips.length);
const tip = tips[0];
balanceresponse = {
"fulfillmentText": ' Anything else you wanna know?'
}
console.log('before response.send()');
response.send(balanceresponse);
/* response.send({
fulfillmentText:
//firestore.collection(addRef.Answer)+
' Anything else you wanna know?'
}); */
return 1;
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
return 1;
})
.catch(function(error) {
console.log("Error getting document:", error);
});
}
// Run the proper function handler based on the matched Dialogflow intent name
let intentMap = new Map();
// intentMap.set('Default Welcome Intent', welcome);
// intentMap.set('Default Fallback Intent', fallback);
intentMap.set('GetName', yourFunctionHandler);
intentMap.set('AdmissionCustom', AdmissionHandler);
agent.handleRequest(intentMap);
});
This is the error I receive:
I have seen few similar questions here but none of them are answered. Can anyone please help? I have been stuck in this for over a week already.
回答1:
The problem is that the yourFunctionHandler(agent)
function is doing things asynchronously, but isn't returning a Promise. Instead, it returns nothing, so the processing returns immediately without having a message sent.
Since it looks like myDoc.add()
returns a Promise, this is easy to handle by making that return myDoc.add(...).then(...)
and so forth. It might look something like this:
function yourFunctionHandler(agent) {
return docRef.add({
myname: name,
college: coll
})
.then(()=>{
response.send({
fulfillmentText:
'Sure '+name+', Do you want to know about Admissions, Fees, Graduates and PG, Contact information, Media or Testimonials?'
});
return 1;
})
.catch(error => {
//console.log('érror',e);
response.send({
fulfillmentText:
'Something went wrong with the database'
});
});
}
Additionally, you're mixing handling the response yourself (by calling response.send()
) and using the Dialogflow agent.handleRequest()
, which will create a response for you.
You should either use the Dialogflow methods to generate the reply with something like
agent.add("No such document found.");
or use the values in the JSON yourself to determine which handler to call with something like
const intentName = request.body.queryResult.intent.name;
const handler = intentMap[intentName];
handler();
(You may need to vary this. It looks like from your code you're using Dialogflow v1, which I've reflected, and the path for the intent name changes for v2. You also should check for the handler not existing, may want to send parameters, etc.)
来源:https://stackoverflow.com/questions/50576932/unhandled-rejection-headers-cant-be-set-after-they-are-sent