Node.js 如何使用Firestore从snap on DialogFlow fullfilment获取地图数组

Node.js 如何使用Firestore从snap on DialogFlow fullfilment获取地图数组,node.js,google-cloud-firestore,dialogflow-es-fulfillment,Node.js,Google Cloud Firestore,Dialogflow Es Fulfillment,我已经使用Firestore从Dialogflow上的输入数据写入了一个数组,如 但我不知道如何从Firestore获取数据以显示在Dialogflow中,下面是我的编程 这就是我想要实现的目标。当我在Dialogflow中输入number时,我想从Firestore实例中获取一个number数组 const db = admin.firestore(); db.settings({timestampsInSnapshots: true}); . . . const sessionId = r

我已经使用Firestore从Dialogflow上的输入数据写入了一个数组,如

但我不知道如何从Firestore获取数据以显示在Dialogflow中,下面是我的编程

这就是我想要实现的目标。当我在Dialogflow中输入number时,我想从Firestore实例中获取一个number数组

const db = admin.firestore();
db.settings({timestampsInSnapshots: true}); 
.
.
.
const sessionId = request.body.session.split("/").reverse()[0]; // or agent.session

  function read(agent){
    const number = agent.parameters.number;  // when I input the number in Fialogflow
    const docRef = db.collection('orders').doc(sessionId);

    return docRef.get()
      .then(doc => {
        if (!doc.exists) {
          agent.add('No data found in the database!');
          console.log(doc);
        } else {
          agent.add(doc.data().orders);
        }
        return Promise.resolve('Read complete');
      }).catch(() => {
        agent.add('Error reading entry from the Firestore database.');
        agent.add('Please add a entry to the database first by saying, "Write <your phrase> to the database"');
      });
  }

  function writeOrderToDb (newOrder) {
    const docRef = db.collection('orders').doc(sessionId);

    return db.runTransaction(t => {
      return t.get(docRef)
      .then(doc => {
        t.update(docRef, {
          orders: admin.firestore.FieldValue.arrayUnion(newOrder)
        }, {merge: true});
        /*if (!doc.data()) {
          t.set(docRef, { orders: [newOrder] });
        }
        else {
          t.update(docRef, {
            orders: admin.firestore.FieldValue.arrayUnion(newOrder)
          });
        }*/
      });
    }).catch(err => {
      console.log(`Error writing to Firestore: ${err}`);
    });
  }


  function confirmOrder(agent) {
    const order = agent.context.get('order'),
          amount = order.parameters.amount,
          size = order.parameters.size,
          type = order.parameters.type;

    agent.add(`Confirming ${amount} ${type} in ${size}`);

    // important to return, otherwise console.logs will not appear and non-deterministic behavior will ocurr
    return writeOrderToDb({
      "type": type,
      "size": size,
      "amount": amount
    });
  }
const db=admin.firestore();
db.settings({timestampsInSnapshots:true});
.
.
.
const sessionId=request.body.session.split(“/”).reverse()[0];//或agent.session
函数读取(代理){
const number=agent.parameters.number;//当我在Fialogflow中输入数字时
const docRef=db.collection('orders').doc(sessionId);
返回docRef.get()
。然后(doc=>{
如果(!doc.存在){
add('在数据库中找不到数据!');
控制台日志(doc);
}否则{
agent.add(doc.data().订单);
}
返回承诺。解决(“阅读完成”);
}).catch(()=>{
add('从Firestore数据库读取条目时出错');
add('请先向数据库添加一个条目,说“Write to the database”');
});
}
函数writeOrderToDb(newOrder){
const docRef=db.collection('orders').doc(sessionId);
返回db.runTransaction(t=>{
返回t.get(docRef)
。然后(doc=>{
t、 更新(docRef{
订单:admin.firestore.FieldValue.arrayUnion(newOrder)
},{merge:true});
/*如果(!doc.data()){
t、 set(docRef,{orders:[newOrder]});
}
否则{
t、 更新(docRef{
订单:admin.firestore.FieldValue.arrayUnion(newOrder)
});
}*/
});
}).catch(错误=>{
log(`写入Firestore时出错:${err}`);
});
}
功能确认人(代理){
const order=agent.context.get('order'),
金额=order.parameters.amount,
大小=order.parameters.size,
类型=order.parameters.type;
add(`confirmating${amount}${type}in${size}`);
//必须返回,否则将不会显示console.logs,并且将出现不确定性行为
返回writeOrderToDb({
“类型”:类型,
“尺寸”:尺寸,
“金额”:金额
});
}

我创建了与您相同的数据模型:

因此,使用下面的代码,您可以将数组范围内的任何数字
“orders”
传递到变量
my_num
。它将返回数组中该部分的数据

var my_num = 1;

db.collection('dial').doc('dial1').get().then(function(doc) {
  console.log(doc.data().orders[my_num]);
});
输出:


我创建了与您相同的数据模型:

因此,使用下面的代码,您可以将数组范围内的任何数字
“orders”
传递到变量
my_num
。它将返回数组中该部分的数据

var my_num = 1;

db.collection('dial').doc('dial1').get().then(function(doc) {
  console.log(doc.data().orders[my_num]);
});
输出:


我认为[1]在这里,您可以找到一个将dialog flow与Firestore连接起来的好例子。[1] 我知道你的意思。虽然我们使用Firestore获取Dialogflow上的数据,但我希望获取每个数组的“sessionId”。例如,我在Dialogflow上输入数字1,然后我将得到数字1数组的值。我认为在这里[1]您可以找到一个关于将Dialogflow与Firestore连接的好例子。[1] 我知道你的意思。虽然我们使用Firestore获取Dialogflow上的数据,但我希望获取每个数组的“sessionId”。例如,我在Dialogflow上输入数字1,然后我将得到数字1数组的值。然而,当我在Dialogflow中输入一个数字时,它出现了错误。“webhookStatus”:{“代码”:14,“消息”:“Webhook调用失败。错误:不可用。”}这仅与Dialogflow相关。确保您正确设置了webhook。你可以点击这个链接,我正在使用Dialogflow开发一个聊天机器人。因为我可以将数据放入Firestore,所以我想从中获取数据。我使用了与您相同的Firestore结构。然而,当我在Dialogflow中输入一个数字时,它出现了错误。“webhookStatus”:{“代码”:14,“消息”:“Webhook调用失败。错误:不可用。”}这仅与Dialogflow相关。确保您正确设置了webhook。你可以点击这个链接,我正在使用Dialogflow开发一个聊天机器人。因为我可以将数据放入Firestore,所以我想从中获取数据。