使用dialogflow保存到两个不同的Firestore数据库

时间:2019-03-27 18:14:40

标签: node.js firebase google-cloud-firestore dialogflow actions-on-google

我正在对Google项目进行操作,需要将数据添加到两个不同的 Cloud Firestore 。由于某种原因,当我触发该意图时,它只会保存到原始的 Cloud Firestore ,而不是新的。

为简单起见,我将原始Cloud 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写入”时,它将向DB2写入“这是一个测试写入”,但是它只是一直将消息/数据写入DB1。 / p>

如何使它工作,以便在触发此意图时将其写入第二个Cloud 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私钥中获取的。即:firebase控制台>项目概述>服务帐户>生成私钥。这可能是问题吗?

1 个答案:

答案 0 :(得分:0)

我认为问题是这样的:

一个Dialogflow项目和一个Firebase项目在后台是相同的。太酷了,因为您的Firebase Functions会直观地与Dialogflow和数据库连接,而无需进行大量手动配置。

但是,如果您有来自不同Cloud Project的两个数据库,则需要进行一些其他配置以安全地连接。我不确定您的AppConfig包含哪些内容,但可能没有足够的设置。因此,当您获取功能config时,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