如何从dialogflow bot中的单个用户获取所有必需的详细信息,以及如何在单个userId下将其存储在firestore中

时间:2018-06-29 05:34:38

标签: google-cloud-firestore chatbot dialogflow

我的示例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

1 个答案:

答案 0 :(得分:0)

从广义上讲,您需要为每个向您传递数据的Intent更新Firestore中存储的文档。您可以使用docRef.update()来做到这一点。

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

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

  2. 然后将其保存在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 );
  };