【问题标题】:Firebase Functions 1.0.0 migration: Trouble with custom initializeApp() with Google Service Account credentialFirebase Functions 1.0.0 迁移:使用 Google 服务帐户凭据自定义 initializeApp() 出现问题
【发布时间】:2018-04-06 16:20:09
【问题描述】:

我刚刚从 beta (v0.9.1) 更新到 v1.0.0,在初始化时遇到了一些问题。根据migration guidefunctions.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()

起初这似乎工作正常,正在识别 databaseURL 和 storageBucket。但是,关于新缺席的credential 字段存在问题。要访问 Google Cloud Storage,该字段是必需的。我在我的应用程序中访问@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_emailservice-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,似乎也希望手动插入databaseURLstorageBucket

那么问题来了,我该怎么做呢?

【问题讨论】:

    标签: firebase google-cloud-storage google-cloud-functions firebase-admin


    【解决方案1】:

    我自己想出来的。我不得不像这样重写我的 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,
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2019-08-16
      • 2020-10-21
      • 2023-03-10
      • 1970-01-01
      • 2017-08-22
      • 2016-11-10
      相关资源
      最近更新 更多