#node.js #firebase #google-cloud-firestore #dialogflow-es #actions-on-google
#node.js #firebase #google-облако-firestore #dialogflow-ы #действия в Google
Вопрос:
Я выполняю действия в Google Project, которые потребуют добавления данных в два разных облачных Firestore. По какой-то причине, когда я запускаю intent, он сохраняется только в исходном облачном Firestore, но не в новом.
Для простоты я собираюсь ссылаться на исходный облачный Firestore как «DB1», а на новый / второй — как «DB2»
Вот что я пробовал:
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const admin = require('firebase-admin');
const {google} = require('googleapis');
const {
<Basically All of the libraries / AOG functions>
} = require('actions-on-google');
const defaultAppConfig = {"<FIREBASE CREDENTIALS FOR DB1 >"}
const OtherAppConfig = {"<FIREBASE CREDENTIALS FOR DB2>"}
const defaultApp = admin.initializeApp(defaultAppConfig); // DB1
const otherApp = admin.initializeApp(OtherappConfig, 'Other'); // DB2
const db = admin.firestore(functions.config(defaultApp).firebase); //DB1
const ab = admin.firestore(functions.config(otherApp).firebase); // DB2
const app = dialogflow({
debug: true,
clientId: '<DIALOGFLOW CREDENTIALS>'
});
app.intent('DB2 Write', (conv) =>{
conv.ask('Okay I made the write to DB2');
var data = {
name: 'This is a Test write'
};
var setDoc = ab.collection('Test').doc('Write').set(data);
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Извините, если некоторые части не нужны, я хотел включить как можно больше информации (возможно, я пропустил что-то, что видит кто-то другой).
Подводя итог тому, что, как я думал, произойдет, я думал, когда я запускал намерение «DB2 Write», что оно запишет «Это тестовая запись» в DB2, однако оно просто продолжает записывать сообщение / данные в DB1.
Как мне заставить это работать, чтобы при запуске этого намерения выполнялась запись в мой второй облачный Firestore или «DB2»?
Спасибо за помощь!
Примечание: Если это имеет значение, я использую встроенный редактор dialogflow для этого кода.
____________________________________________________________________________
Обновление: Вот что я пробовал / обновил, и это все еще записывается в DB1
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
const otherAdmin = require('firebase-admin');
otherAdmin.initializeApp({
credential: otherAdmin.credential.cert(OtherAppConfig)
},'Other');
const ab = otherAdmin.firestore();
а также:
admin.initializeApp(defaultAppConfig);
var otherApp = admin.initializeApp(OtherAppConfig, 'other');
console.log(admin.app().name); // '[DEFAULT]'
console.log(otherApp.name); // 'other'
// Use the shorthand notation to retrieve the default app's services
var db = admin.firestore(functions.config().firebase);
// Use the otherApp variable to retrieve the other app's services
var ab = otherApp.firestore(functions.config().firebase);
Я хотел бы отметить, что учетные данные, которые я использую для «OtherAppConfig» и «defaultAppConfig», были взяты из закрытого ключа Firebase. ie: консоль firebase> обзор проекта> учетные записи служб > сгенерировать закрытый ключ. Может ли это быть проблемой?
Комментарии:
1. Я вижу, вы используете
ab
для написания документа. Вы также не используетеdb
для выполнения того же самого. Также, похоже, вы не обрабатываете обещание, возвращенное вsetDoc
. Вам почти наверняка придется что-то с этим делать.2. Извините за уточнение, у меня есть другие намерения, которые используют ‘db’, который работает нормально, но когда я использовал ‘ab’ или DB2, он записывал в ‘db’ или DB1
3. В firebase существует 2 типа баз данных реального времени: облачный firestore и база данных реального времени, какая у вас?
4. облачный firestore, я обновлю
5. Это два разных проекта?
Ответ №1:
Я думаю, что проблема заключается в следующем:
Проект Dialogflow и проект Firebase — это одно и то же по сути. Это здорово, поскольку ваши функции Firebase будут интуитивно подключаться к Dialogflow и вашей базе данных без долгой настройки вручную.
Однако, если у вас есть две базы данных из разных облачных проектов, вам потребуется выполнить некоторые дополнительные настройки для безопасного подключения. Я не уверен, что содержат ваши AppConfig
базы данных, но они могут быть недостаточно настроены. Таким образом, настройка Firebase может использовать приложение и базу данных по умолчанию (текущий проект), когда вы получаете конфигурацию функций.
Возможно, вы захотите загрузить служебный ключ для своего второго проекта. Затем вы можете загрузить его в виде файла или непосредственно в формате JSON в вашей программе запуска.
Приведенный ниже фрагмент должен работать так, как вы хотите.
// Setup 1st db, this project's db
const admin = require('firebase-admin');
admin.initializeApp(); // Initialize with default params as we get it by default
const db = admin.firestore();
// Setup 2nd db
const otherAdmin = require('firebase-admin'); // We can import twice
const myOtherServiceKey = { ... }
otherAdmin.initializeApp({
credential: otherAdmin.credential.cert(myOtherServiceKey)
});
const ab = otherAdmin.firestore(); // This should be the DB of our second project
Комментарии:
1. Я получаю следующую ошибку при запуске этого — Подробная трассировка стека: Ошибка: приложение Firebase по умолчанию уже существует. Это означает, что вы вызывали initializeApp () более одного раза, не указывая имя приложения в качестве второго аргумента. В большинстве случаев вам нужно вызвать initializeApp () только один раз. Но если вы хотите инициализировать несколько приложений, передайте второй аргумент в initializeApp(), чтобы присвоить каждому приложению уникальное имя.
2. У меня была точно такая же проблема, но приведенный выше код решил эту ошибку
3. Работает ли приведенный выше фрагмент, если вы укажете имя во втором
initializeApp
?4. Ошибки нет, но запись в DB1 продолжается. Я опубликую фрагмент того, что я делаю, возможно, я делаю это неправильно
5. В разделе «обновление» в моем вопросе находится то, что я пытался