我需要将在 Dialogflow控制台中输入的一些详细信息存储到Firestore数据库中,
我有以下代码:
index.js
const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(
(request, response) => {
let action = request.body.result.action;
var Name = request.body.result.parameters.Name;
let params = request.body.result.parameters;
var Answer1 = request.body.result.parameters.Answer1;
let query = request.body.result.resolvedQuery;
const parameters = request.body.result.parameters;
const inputContexts = request.body.result.contexts;
console.log("Parameters is" + params);
console.log("Answer1 is " + Answer1);
console.log("Helllo");
console.log("action is " + action);
if (action == "save.name") {
admin
.firestore()
.collection("users")
.doc(Name)
.set({
name: Name,
answer: ""
})
.then(ref => {
var doc = admin
.firestore()
.collection("users")
.doc(Name)
.get();
console.log("Added new user");
console.log("Name is " + Name);
console.log("ref id is:" + ref.id);
});
}
//const ref = this.Name;
if (action == "save.answer1") {
// var Name = this.request.body.result.parameters.Name;
console.log("name in second if", Name);
admin
.firestore()
.collection("users")
.doc(doc)
.update({
answer: Answer1
})
.then(ref => {
console.log("Added new user");
console.log("Name is " + Name);
console.log("ref id is:" + ref.id);
});
}
}
);
此代码成功将名称添加到数据库中,然后退出代码,再次重新输入以保存Answer1,所以我不知道如何引用添加名称的文档。用户先前输入的名称”,然后将答案1添加到同一文档下
示例:
if (action == "save.answer1") {
admin
.firestore()
.collection("users")
.doc("ABC")
.update({
answer: Answer1
})
我在这里将文档名称硬编码为 ABC ,因此它在文档下添加了answer1,如何避免对名称进行硬编码?
我需要获取存储名称的文档的DocumentId,以便添加Answer1,
答案 0 :(得分:2)
首先-不要尝试查找一个查询,该查询找到“最后添加的文档”。我不知道它是否存在,但是如果您在不同的会话中有两个不同的用户添加文档然后尝试更新它们,那么它将做错事情。这是比赛条件,非常糟糕。
相反,您可以做的是将文档标识符(在您的情况下为名称)保存在Dialogflow Context中的参数中。然后,下次调用Webhook时,可以从该上下文中检索参数,并在.doc()
引用中使用该参数。
您没有显示如何将消息发送回Dialogflow,但看起来您可能正在使用Dialogflow V1 JSON。如果是这样,您可以在响应中的contextOut
属性下设置上下文。这将是您要设置的上下文数组。因此,JSON片段的这一部分可能类似于:
"contextOut": [
{
"name": "doc_name",
"lifespan": 5,
"parameters": {
"name": Name
}
}
]
在处理“ save.answer1”操作时,您将遍历传入的上下文以找到正确的上下文并在更新中使用此名称。这样该段可能看起来像这样:
if (action == "save.answer1") {
var Name;
for( var co=0; inputContexts && co<inputContexts.length && !Name; co++ ){
var context = inputContexts[co];
if( context.name == 'doc_name' ){
Name = context.parameters.name;
}
}
console.log("name in second if", Name);
admin
.firestore()
.collection("users")
.doc(Name)
.update({
answer: Answer1
})
.then(ref => {
console.log("Updated user");
console.log("Name is " + Name);
console.log("ref id is:" + ref.id);
});
}