gpt4 book ai didi

node.js - 未处理的拒绝: Headers cant be set after they are sent

转载 作者:太空宇宙 更新时间:2023-11-03 21:48:53 24 4
gpt4 key购买 nike

我正在 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()

我在这里看到了一些类似的问题,但没有一个得到解答。有人可以帮忙吗?我已经被困在这个问题上一个多星期了。

最佳答案

问题是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(我已经反射(reflect)过),并且 v2 的意图名称的路径发生了变化。您还应该检查处理程序是否不存在,可能要发送参数等)

关于node.js - 未处理的拒绝: Headers cant be set after they are sent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50576932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com