Dialogflow agent.add не работает должным образом - PullRequest
0 голосов
/ 25 мая 2020
function readfromdb(agent) {
  //agent.add("Hi");
  var booksinlibrary = [];
  var books = admin.database().ref('data/books');
  return books.on("value",function(data){
    var _data = data.val();
    for (var key in _data){
      console.log("key is",key);
      var book = _data[key];
      console.log("book is",book);
      var name = book.name;
      var author = book.author;
      var res = `name is ${name} and author is ${author}`;
      booksinlibrary.push(res);
    } 
    console.log(booksinlibrary[0]);
    agent.add(`Books available are ${booksinlibrary[0]}`);
  }); 
} 

Информация не отображается на симуляторе помощника и показывает недоступный статус. Я могу зарегистрировать данные, но не могу их отобразить. при комментировании второй строки agent.add («Привет») он отображается в симуляторе как «Привет».

1 Ответ

0 голосов
/ 25 мая 2020

Непосредственная проблема заключается в том, что readfromdb() должен возвращать Promise, так как он выполняет асинхронную операцию, а библиотека ожидает возврата Promise, поэтому она знает, что нужно дождаться завершения асинхронной операции (вашего вызова базы данных). перед отправкой любых значений.

Поскольку вы используете форму обратного вызова on(), возвращаемое значение - это функция обратного вызова. Таким образом, вы возвращаете функцию, а не обещание.

Вместо этого вы должны использовать форму обещания once(), которая возвращает обещание, так что вы будете выполнять свою работу в блоке then(), который также возвращается. Ваш код может выглядеть примерно так:

function readfromdb(agent) {
  //agent.add("Hi");
  var booksinlibrary = [];
  var books = admin.database().ref('data/books');
  return books.once("value").then( data => {
    var _data = data.val();
    for (var key in _data){
      console.log("key is",key);
      var book = _data[key];
      console.log("book is",book);
      var name = book.name;
      var author = book.author;
      var res = `name is ${name} and author is ${author}`;
      booksinlibrary.push(res);
    } 
    console.log(booksinlibrary[0]);
    agent.add(`Books available are ${booksinlibrary[0]}`);
  }); 
} 

Также важно использовать once(), поскольку on() устанавливает обратный вызов каждый раз, когда изменяется значение, которое вам не нужно (и которое выиграло обычно не работает как часть веб-перехватчика Dialogflow). Вы просто хотите запросить значение, чтобы вернуть его.

...