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

How to get all the required details from a single user in dialogflow bot and to get that stored in firestore under a single userId

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

从广义上讲,您需要做的是为每个向您传送数据的 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 );
  };