firebase 导入服务抛出错误

Adi*_*ari 10 node.js firebase google-cloud-functions

我正在使用 firebase 函数,我想使用服务帐户密钥 json 将 App 初始化为凭据,但出现错误

'{ "type": string; 类型的参数 “project_id”:字符串;“private_key_id”:字符串;“private_key”:字符串;“client_...”不能分配给“string | ServiceAccount”类型的参数。类型“{“type”:string;“project_id”:string;“private_key_id”:string;“private_key”:string;“client_.. .' 与类型 'ServiceAccount' 没有共同的属性。

我的 index.ts 文件

 import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
import {serviceAccount} from './serviceAccount'

console.log(functions.config())
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL:functions.config().firebase
});

export const firestore = admin.firestore();
export const firebase = admin.database();
Run Code Online (Sandbox Code Playgroud)

serviceAccount.ts

export const serviceAccount = {

    "type": "service_account",
    "project_id": "lxxxxxx",
    "private_key_id": "xxxxxx",
    "private_key": "-----BEGIN PRIVATE KEY-----xxxxxxx---END PRIVATE KEY-----\n",
    "client_email": "firebase-axxxxx-9b58b.iaxxxceaccount.com",
    "client_id": "xxxxx",
    "auth_uri": "https://accounts.google.com/o/xxxxx",
    "token_uri": "https://accounts.google.com/o/oxxxxn",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "clixxxxxx": "https://www.googleapis.com/robot/v1/metadataxxxxirebase-adminsdk-uxxxxxxrviceaccount.com"


}
Run Code Online (Sandbox Code Playgroud)

这行代码中的错误

        credential: admin.credential.cert(serviceAccount),
Run Code Online (Sandbox Code Playgroud)

Seb*_*tre 19

我也经历过这个。解决方案是ServiceAccount将从该 json 文件导入的整个对象带入类型并强制转换为该类型。

import firebase from 'firebase' 
import * as firebaseAdmin from 'firebase-admin' 
import firebaseConfig from '../firebaseConfig.json' 
import firebaseAccountCredentials from '../serviceAccountCredentials.json'

const serviceAccount = firebaseAccountCredentials as admin.ServiceAccount

firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.cert(serviceAccount),
    databaseURL: firebaseConfig.databaseURL 
});
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢语法 `credential: admin.credential.cert( <ServiceAccount>serviceAccount ),` (2认同)

Len*_*ter 3

我对 TypeScript 的经验不是很丰富,但我认为这将作为一种临时解决方案,直到有人提出更好的解决方案。

let regularObj = {};
Object.assign(regularObj, serviceAccount);

admin.initializeApp({
  credential: admin.credential.cert(regularObj),
  databaseURL: functions.config().firebase
});
Run Code Online (Sandbox Code Playgroud)