Я использую Dialogflow , чтобы создать Действие для Google Assistant .Все работает, кроме выполнения моего намерения.
Я использую Inline Editor (Powered by Cloud Functions for Firebase) для выполнения намерения.Моя функция сама по себе работает - так как я могу отправить текст помощнику из функции.
Но по какой-то причине выполнение кода никогда не входит в функцию, которая извлекает данные из моего Collection
в Firebase Firestore - хотя делает Выполнять команды до и после.
Вот код в моем index.js
.
'use strict';
const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
let db = admin.firestore();
const {dialogflow} = require('actions-on-google');
const app = dialogflow({debug: true});
app.intent('INTENT', (conv, {ENTITY}) => {
conv.add("Hello."); //THIS IS DISPLAYED
db.collection("COLLECTION").orderBy("FIELD", "desc").get().then(snapshot => {
conv.add("Hey!"); //THIS IS NOT DISPLAYED
snapshot.forEach(doc => {
conv.add("Hi?"); //NOR IS THIS
});
conv.add("Hmm..."); //NEITHER THIS
}).catch(error => {
conv.add('Error!'); //NOT EVEN THIS
});
conv.add("Bye."); //THIS IS DISPLAYED TOO
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Очевидно, это показывает, что выполнение никогда не входило в блок db...
, и, следовательно,функция даже не выдавала никаких ошибок.
Вот журналы из Firebase.
Function execution started
Billing account not configured...
Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail
Request {...}
Headers {...}
Conversation {...}
Response {...}
Function execution took 1681 ms, finished with status code: 200
Я знаю, что функция firestore
извлекает данные асинхронно, но, похоже, я никак не мог выполнить что-либо даже внутри ее блока .then(...)
.
Я также пытался return
извлечь Promise
из.then(...)
блок и использование второго .then(...)
с ним - что опять не работает.
var fetch = db.collection("COLLECTION").orderBy("FIELD", "desc").get().then(snapshot => {
conv.add("Hey!"); //NOT DISPLAYED
var responseArr = [];
snapshot.forEach(doc => {
conv.add("Hi?"); //NOT DISPLAYED
responseArr.push(doc);
});
conv.add("Hmm..."); //NOT DISPLAYED
return Promise.resolve(responseArr);
}).then(fetch => {
conv.add("Here?"); //NOT DISPLAYED
}).catch(error => {
conv.add('Error!'); //NOT DISPLAYED
});
Наконец, я также попытался поместить функцию firestore
в отдельный function
, какэто.
function getData(){
return db.collection("COLLECTION").orderBy("FIELD", "desc").get().then(snapshot => {
snapshot.forEach(doc => {
...
});
return data; //Manipulated from above. 'data' can be a string.
}).catch(error => {
return error;
});
}
app.intent('INTENT', (conv, {ENTITY}) => {
conv.add("Hello."); //THIS IS DISPLAYED
conv.add(getData()); //THIS IS NOT DISPLAYED
conv.add("Bye."); //THIS IS DISPLAYED
});