Непосредственная проблема заключается в том, что 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). Вы просто хотите запросить значение, чтобы вернуть его.