前提・実現したいこと
Dialogflow(US)で作成したエージェントをFulfillment機能のInline Editorを使って、Cloud Firestoreとデータのやり取り(追加・更新・削除)をしたいと思っています。
プロジェクトIDが同じなら!!と思い、色々なサイトを参考に取り組んでみたのですが、、
あえなく撃沈というか頓挫になってしまいました
発生している問題・エラーメッセージ
単刀直入に立ち止まっている原因を記すと
warning, firebase_config environment variable is missing. initializing firebase-admin will fail
です。。
環境変数のFIREBASE_CONFIGが無いですよと警告されました
このままでも動くので、エージェントに任意の質問をしても
Function execution took 183 ms, finished with status: 'crash'
が返ってくるだけです(泣)
該当のソースコード
index.js (まずは何もいじらないでざっくりと該当箇所だけ)
const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore();
package.json (一応ノード8が濃厚説っぽいので、、)
{ "name": "dialogflowFirebaseFulfillment", "description": "This is your fulfillment for a Dialogflow agents using Cloud Functions for Firebase", "version": "0.0.1", "private": true, "license": "Apache Version 2.0", "author": "Google Inc.", "engines": { "node": "8" }, "scripts": { "lint": "semistandard --fix \"**/*.js\"", "start": "firebase deploy --only functions", "deploy": "firebase deploy --only functions" }, "dependencies": { "dialogflow": "^0.6.0", "firebase-admin": "^6.0.0", "firebase-functions": "^2.0.5", "dialogflow-fulfillment": "0.5.0", "actions-on-google": "2.3.0" } }
試したこと
1.「dialogflow firestore」と検索!
Dialogflowのインラインエディターを介してDialogflowをCloud Firestoreに接続する方法
→ここに記載されているサンプル通りに書きました
const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); const db = admin.firestore();
しかしFirebaseのガイド(Firebase SDK for Cloud Functions アップグレード ガイド: ベータ版からバージョン 1.0 以降へのアップグレード)では、v1.0.0以降ではfunctions.config().firebaseの代わりにprocess.env.FIREBASE_CONFIGを使用せよとのこと、、?
なので
const firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG); admin.initializeApp(firebaseConfig);
しかしエラーは消えず、、
console.log(process.env.FIREBASE_CONFIG);
を試したところ、、、undefined が返ってきました(泣)
そこで
process.env.FIREBASE_CONFIG = "{\"projectId\":\"プロジェクトID\",\"databaseURL\":\"https://プロジェクトID.firebaseio.com\",\"storageBucket\":\"プロジェクトID.appspot.com\",\"locationId\":\"asia-northeast1\"}"; const firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG); admin.initializeApp(firebaseConfig);
と無理やり突っ込んだところ、先ほどのログに返り値はあるものの
warning, firebase_config environment variable is missing. initializing firebase-admin will fail
missingが返ってきます(泣)
もしかして、リージョンが違うのが関係しているのか??
dialogflow:US
firestore:asia-northeast1
うーーん、、
2.Configの内容が足りないのでは、、
色々なサイトを駆け巡っていたら良さげなのがあったのですが
const firebaseConfig = { apiKey: "apiキー", authDomain: "プロジェクトID.firebaseapp.com", databaseURL: "https://プロジェクトID.firebaseio.com", projectId: "プロジェクトID", storageBucket: "プロジェクトID.appspot.com", messagingSenderId: "sender-id", appID: "app-id" }; admin.initializeApp(firebaseConfig);
ん?、、FirebaseのプロジェクトのマイアプリにWebアプリを作れということでしょうか??
これは試していないので、「それだよそれ!」という方がいましたら私を叱ってください、、
3.credentialは必要っぽい??
Firebaseのガイド(環境の構成)の通りに書くと
serviceAccount = require('./serviceAccount.json'); const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG); adminConfig.credential = admin.credential.cert(serviceAccount); admin.initializeApp(adminConfig);
なお、serviceAccountは読み込みにしたくないので
process.env.FIREBASE_CONFIG = "省略(上記と同じ)"; const serviceAccount = { "type": "service_account", "project_id": "プロジェクトID", "private_key_id": "秘密鍵のID", "private_key": "-----BEGIN PRIVATE KEY-----\n秘密鍵\n-----END PRIVATE KEY-----\n", "client_email": "firebase-adminsdk-固有値@プロジェクトID.iam.gserviceaccount.com", "client_id": "クライアントID", "auth_uri": "uri", "token_uri": "uri", "auth_provider_x509_cert_url": "url", "client_x509_cert_url": "url" }; const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG); adminConfig.credential = admin.credential.cert(serviceAccount); admin.initializeApp(adminConfig);
しかし
warning, firebase_config environment variable is missing. initializing firebase-admin will fail
4.違う形で試した(悪あがき)
admin.initializeApp({ credential: admin.credential.cert({ "type": "service_account", "project_id": "プロジェクトID", "private_key_id": "秘密鍵のID", "private_key": "-----BEGIN PRIVATE KEY-----\n秘密鍵\n-----END PRIVATE KEY-----\n", "client_email": "firebase-adminsdk-固有値@プロジェクトID.iam.gserviceaccount.com", "client_id": "クライアントID", "auth_uri": "uri", "token_uri": "uri", "auth_provider_x509_cert_url": "url", "client_x509_cert_url": "url" }), databaseURL: "https://プロジェクトID.firebaseio.com", projectId: "プロジェクトID", storageBucket: "プロジェクトID.appspot.com" });
でもダメでした。。エラーは消えませんし、関数を動かすとcrashしてしまいます
なにか根本的に違うのか、誤解があるのか、、
駆け出しのプログラマには分かりかねるところがあるので
どなたか解決法をお知りの方は教えてください!
5. Cloud FirestoreへのREST apiはどうか??
axiosを使って検証しましたが
warning, firebase_config environment variable is missing. initializing firebase-admin will fail
です。。crashですね
補足情報(FW/ツールのバージョンなど)
DialogflowのInline Editorを使用しています
パソコンはMac(関係ないかぁ)
あなたの回答
tips
プレビュー