Firebase Functions 1.0.0 迁移:使用 Google 服务帐户凭据的自定义 initializeApp() 出现问题
Firebase Functions 1.0.0 migration: Trouble with custom initializeApp() with Google Service Account credential
我刚刚从测试版 (v0.9.1) 更新到 v1.0.0,并且 运行 遇到了一些初始化问题。根据 migration guide,functions.config().firebase
现在已弃用。这是我之前的初始化:
const serviceAccount = require('../service-account.json')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: functions.config().firebase.databaseURL,
storageBucket: functions.config().firebase.storageBucket,
projectId: functions.config().firebase.projectId,
})
这是我升级后的样子:
admin.initializeApp()
起初这似乎工作正常,正在识别数据库URL 和 storageBucket。但是,关于新缺席的 credential
字段存在问题。该字段是访问 Google 云存储所必需的。我像这样在我的应用程序中访问 @google-cloud/storage
API:
import { Bucket, File } from '@google-cloud/storage'
import * as admin from 'firebase-admin'
bucket: Bucket = admin.storage().bucket()
this.bucket
.upload(filepath, {
destination: uploadPath,
})
.then((fileTuple: [File]) => {
// after uploading, save a reference to the audio file in the DB
fileTuple[0]
.getSignedUrl({ action: 'read', expires: '03-17-2025' })
.then((url: [string]) => {
dbRef.child('audioFiles').push(url[0])
})
.catch(err => console.log('Error:', err))
console.log(`${filepath} uploaded to ${this.bucket.name}.`)
})
这会将文件上传到存储,然后将已签名的 URL 插入到我的实时数据库中。
迁移后,这段代码出现以下错误:
SigningError: Cannot sign data without `client_email`
由于 client_email
是 service-account.json
上的一个字段,我怀疑我需要重新插入 credentials
,像这样:
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
})
但是,当我尝试此操作时,出现 Error: Can't determine Firebase Database URL.
或 Error: Bucket name not specified or invalid.
之类的错误。因此,如果我手动插入 credential
,它似乎期望 databaseURL
和 storageBucket
也被手动插入。
所以问题是,我该怎么做?
我自己想出来了。我不得不像这样重写我的 init 调用:
const serviceAccount = require('../service-account.json')
const firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG)
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: firebaseConfig.databaseURL,
storageBucket: firebaseConfig.storageBucket,
projectId: firebaseConfig.projectId,
})
我刚刚从测试版 (v0.9.1) 更新到 v1.0.0,并且 运行 遇到了一些初始化问题。根据 migration guide,functions.config().firebase
现在已弃用。这是我之前的初始化:
const serviceAccount = require('../service-account.json')
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: functions.config().firebase.databaseURL,
storageBucket: functions.config().firebase.storageBucket,
projectId: functions.config().firebase.projectId,
})
这是我升级后的样子:
admin.initializeApp()
起初这似乎工作正常,正在识别数据库URL 和 storageBucket。但是,关于新缺席的 credential
字段存在问题。该字段是访问 Google 云存储所必需的。我像这样在我的应用程序中访问 @google-cloud/storage
API:
import { Bucket, File } from '@google-cloud/storage'
import * as admin from 'firebase-admin'
bucket: Bucket = admin.storage().bucket()
this.bucket
.upload(filepath, {
destination: uploadPath,
})
.then((fileTuple: [File]) => {
// after uploading, save a reference to the audio file in the DB
fileTuple[0]
.getSignedUrl({ action: 'read', expires: '03-17-2025' })
.then((url: [string]) => {
dbRef.child('audioFiles').push(url[0])
})
.catch(err => console.log('Error:', err))
console.log(`${filepath} uploaded to ${this.bucket.name}.`)
})
这会将文件上传到存储,然后将已签名的 URL 插入到我的实时数据库中。
迁移后,这段代码出现以下错误:
SigningError: Cannot sign data without `client_email`
由于 client_email
是 service-account.json
上的一个字段,我怀疑我需要重新插入 credentials
,像这样:
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
})
但是,当我尝试此操作时,出现 Error: Can't determine Firebase Database URL.
或 Error: Bucket name not specified or invalid.
之类的错误。因此,如果我手动插入 credential
,它似乎期望 databaseURL
和 storageBucket
也被手动插入。
所以问题是,我该怎么做?
我自己想出来了。我不得不像这样重写我的 init 调用:
const serviceAccount = require('../service-account.json')
const firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG)
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: firebaseConfig.databaseURL,
storageBucket: firebaseConfig.storageBucket,
projectId: firebaseConfig.projectId,
})