Как получить массив карт из оснастки при заполнении DialogFlow с помощью Firestore

Я записал в массив входные данные в Dialogflow с помощью Firestore, например это.

Но я не знаю, как получить данные из Firestore для отображения в Dialogflow, а под ними моя программка.

Вот чего я хочу добиться. Когда я ввожу число в Dialogflow, я хотел бы получить массив чисел из экземпляра Firestore.

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
    });
  }

person 李宇澄    schedule 12.11.2019    source источник
comment
Думаю, здесь [1] вы сможете найти хороший пример подключения диалогового потока к Firestore. [1] stackoverflow.com/questions/51692357/   -  person Oqueli A. Martinez    schedule 15.11.2019
comment
Я знаю, что Вы имеете ввиду. Хотя мы извлекаем данные о Dialogflow из Firestore, я хотел бы получить идентификатор сеанса каждого массива. Например, я ввожу номер один в Dialogflow, а затем получаю значение массива номер один.   -  person 李宇澄    schedule 15.11.2019


Ответы (1)


Я создал ту же модель данных, что и ваша:

введите здесь описание изображения

Таким образом, с помощью следующего кода вы можете передать любое число из диапазона вашего массива "orders" в переменную my_num. Он вернет данные внутри этой части массива.

var my_num = 1;

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

Вывод:

введите здесь описание изображения

person Waelmas    schedule 10.12.2019
comment
Я сделал ту же структуру Firestore, что и ваша. Однако это показало ошибку, когда я ввел одно число в Dialogflow. webhookStatus: {код: 14, сообщение: вызов веб-перехватчика не выполнен. Ошибка: НЕДОСТУПНО. } - person 李宇澄; 09.01.2020
comment
Это относится только к Dialogflow. Убедитесь, что вы правильно настраиваете вебхук. Вы можете перейти по этой ссылке cloud.google.com/dialogflow/docs/fulfillment-overview - person Waelmas; 09.01.2020
comment
Я разрабатываю один чат-бот с использованием Dialogflow. Потому что я мог бы поместить данные в Firestore, поэтому я хотел бы получить данные из него. - person 李宇澄; 09.01.2020