如何在对话流机器人中从单个用户获取所有必需的详细信息,并将其存储在单个用户 ID 下的 firestore 中



我的示例索引.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 中, 我希望单个用户的所有详细信息都存储在单个用户 ID 中

也就是说,如果所有用户都被问到相同的问题,我可以在一个意图中处理所有这些问题。但是我必须从每个用户那里获得不同的信息,所以我必须提出多个问题,并在为同一用户获得答案时存储所有答案。我该怎么做?

我正在使用 api v1 机器人

从广义上讲,您需要做的是针对向您交付数据的每个意图更新存储在 Firestore 中的文档。您可以使用docRef.update().

棘手的一点是,当您创建文档时,您需要保存一种方法,以便稍后恢复文档以进行更新。这需要两件事:

  1. 您需要使用已知 ID 创建文档,或者获取系统分配的 ID。

  2. 然后,将其保存在对话流上下文中,并在下次处理意图时将其从上下文中取出。

我们将用户 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
};

当下一个意图信息进入处理时,您需要获取用户 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;
}

在你的意图处理中,你会得到 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 );
};

相关内容

最新更新