未处理的拒绝:标题在发送后无法设置

时间:2018-05-29 05:34:17

标签: node.js google-cloud-firestore dialogflow

我在Dialogflow中创建一个聊天机器人。我正在尝试将数据添加到数据库时,它会抛出一个未处理的拒绝错误。

这是我的 index.js 文件。

'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);
});

这是我收到的错误:

You can see the error that occurs in MyFunctionHandler on passing response.send()

我在这里看到几个类似的问题,但没有一个得到回答。有人可以帮忙吗?我已经坚持了一个多星期了。

1 个答案:

答案 0 :(得分:2)

问题是yourFunctionHandler(agent)函数异步处理,但是没有返回Promise。相反,它不返回任何内容,因此处理立即返回而不发送消息。

由于看起来myDoc.add()返回Promise,因此通过制作return myDoc.add(...).then(...)等等很容易处理。它可能看起来像这样:

  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'
        });
    });
  }

此外,您自己混合处理响应(通过调用response.send())并使用Dialogflow agent.handleRequest(),这将为您创建响应。

您应该使用Dialogflow方法生成类似

的回复
agent.add("No such document found.");

或者自己使用JSON中的值来确定用

之类的东西调用哪个处理程序
const intentName = request.body.queryResult.intent.name;
const handler = intentMap[intentName];
handler();

(您可能需要改变这一点。从您的代码看起来您​​使用的是Dialogflow v1,我已经反映了这一点,并且意图名称的路径也因v2而改变。您还应该检查处理程序不存在,可能要发送参数等。)