Сохранение в две разные базы данных Firestore с помощью dialogflow

#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. В разделе «обновление» в моем вопросе находится то, что я пытался