我的示例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 query = request.body.result.resolvedQuery;
const parameters = request.body.result.parameters;
const inputContexts = request.body.result.contexts;
if(action === 'save.name' || inputContexts == 'welcome'){
admin.firestore().collection('users').add({
name: Name
}).then(ref => {
console.log('Added new user');
});
}
});
现在,我已经实现了分别保存名称和分别保存其他详细信息的方法,但是问题是所有内容都存储在Firestore的单独的userId中, 我希望将单个用户的所有详细信息存储在单个userId中
这就是说,如果所有用户都被问到相同的问题,那么我可以一心一意地处理所有问题。但是我必须从每个用户那里获得不同的信息,所以我必须问多个问题,并在为同一用户获得答案时存储所有答案。我该怎么办?
我正在使用api v1 bot
答案 0 :(得分:0)
从广义上讲,您需要为每个向您传递数据的Intent更新Firestore中存储的文档。您可以使用docRef.update()
来做到这一点。
棘手的一点是,当您创建文档时,您需要保存一种方法,以便稍后将其取回以进行更新。这需要两件事:
您需要使用已知的ID创建文档,或获取系统分配的ID。
然后将其保存在Dialogflow上下文中,并在下次处理Intent时将其从上下文中删除。
我们将使用用户ID进行一些操作,因此我们可以在顶部声明它。
var userId; // We'll use this for a few things
创建文档时,返回的ref
有一个字段id
,其中包含添加的文档的ID。
admin.firestore().collection('users').add({
name: Name
}).then(ref => {
userId = ref.id;
console.log('Added new user with id '+userId);
});
您没有显示如何将提示发送回用户,但是我感觉到您正在使用JSON。如果是这样,您将使用以下内容设置或更新输出上下文:
var outputContext = [
{
name: "user_information",
lifespan: 5,
parameters: {
id: userId
}
}
];
responseObject = {
// ...
outputContext: outputContext
};
当要处理下一个Intent信息时,您需要获取用户ID。我已经将其分解为一个函数(不是最简洁或最高效的函数,但通常说明了如何处理它):
var getIdFromRequest = function( request ){
var id;
var contexts = request.body.result.contexts;
for( var co=0; co<contexts.length; co++ ){
var context = contexts[co];
if( context.name === 'user_information' ){
id = context.parameters.id;
}
}
return id;
}
在Intent处理中,您将获得ID
userId = getIdFromRequest( request );
当我们添加数据时,我们将创建一个对象,向其中添加参数,然后使用该新对象更新文档。 (这段代码不是最有效的方法,但是从逻辑上讲,它是这样的)
var updateObj = {};
if( parameters.color ){
updateObj.color = parameters.color;
}
if( parameters.pet ){
updateObj.pet = parameters.pet;
}
if( parameters.age ){
updateObj.age = parameters.age;
}
admin.firestore().collection('users').doc(userId).update( updateObj )
.then( ref => {
console.log('User updated');
})
.catch( err => {
console.error.( 'Something is wrong', err );
};