【问题标题】:firebase import service throws errorfirebase 导入服务抛出错误
【发布时间】:2018-10-20 16:20:49
【问题描述】:

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

类型参数 '{ "type": string; “project_id”:字符串; “private_key_id”:字符串; “private_key”:字符串; “client_...”不能分配给“string | ServiceAccount”类型的参数。 类型'{“类型”:字符串; “project_id”:字符串; “private_key_id”:字符串; “private_key”:字符串; “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();

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"


}

这行代码的错误

        credential: admin.credential.cert(serviceAccount),

【问题讨论】:

    标签: node.js firebase google-cloud-functions


    【解决方案1】:

    我也经历过。解决方案是引入类型 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 
    });
    

    【讨论】:

    • 我更喜欢语法credential: admin.credential.cert( <ServiceAccount>serviceAccount ),
    • 用 = 声明变量然后也用作语法时调用的语法是什么?这对我不起作用,“as”会抛出意外的标识符
    【解决方案2】:

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

    let regularObj = {};
    Object.assign(regularObj, serviceAccount);
    
    admin.initializeApp({
      credential: admin.credential.cert(regularObj),
      databaseURL: functions.config().firebase
    });
    

    【讨论】:

    • 非常适合字符串内容。 JSON.parse(fileContent); //先把字符串转成JSON Object 谢谢。
    【解决方案3】:

    我遇到过这样的问题。
    尝试转换为 JSON 并返回。
    像这样:

    admin.initializeApp({
      credential: admin.credential.cert(JSON.parse(JSON.stringify(serviceAccount))),
      databaseURL: functions.config().firebase
    });
    

    【讨论】:

      【解决方案4】:

      我有一个非常简单的方法,你只需给那个导入一个类型。在我的情况下对象。

      import * as serviceAccount  from './service-account.json';
      const credentialObject:object = serviceAccount;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 2019-05-23
        相关资源
        最近更新 更多