无法导出 firebase-admin 的 initializeApp 函数

Cannot export firebase-admin's initializeApp function

为了抽象 firebase-admin 依赖项,我有一个文件 index.js 用于导出我的项目使用的功能。为什么无法将 initializeApp 导出为 属性?

例如:

index.js

const firebaseAdmin = require('firebase-admin');

exports.initializeApp = firebaseAdmin.initializeApp;

consumer.js

const firebaseAdmin = require('path/to/index.js');

firebaseAdmin.initializeApp();

抛出以下错误:

TypeError: Cannot read property 'initializeApp' of undefined

为了隔离问题,我写了以下内容来证明 initializeApp 不能导出为 属性,就像我对其他函数所做的那样:

const firebaseAdmin = require('firebase-admin');

const initializeApp = firebaseAdmin.initializeApp;

initializeApp();

这抛出:

TypeError: Cannot read property 'INTERNAL' of undefined

为什么我不能将 initializeApp 导出为 属性?这个错误迫使我将 index.js 中的导出重写为:

exports.initializeApp = () => firebaseAdmin.initializeApp();

但这感觉像是一个 hack。

我的每个文件都以 'use strict;' 开头有什么不同吗?那将是令人惊讶的。

这是 Admin SDK 实施方式的结果。 Admin SDK包主要导出的不是真正的模块,而是一个class的实例。因此,当您从 class 实例中提取单个方法时,它会丢失所有上下文,并且 this 等内部引用开始出现故障。这里有一个简单的例子来说明这个问题。

// file: sdk.ts
class Firebase {
  public INSTANCE = {key: 'sdk'};

  public initializeApp() {
    console.log('Initializing', this.INSTANCE['key']);
  }
}

const admin = new Firebase();
export = admin;
# File: test.js
// admin actually points to an instance of the Firebase class
const admin = require('./sdk');

// extract a single method from the object instance
const initializeApp = admin.initializeApp;

// The "this" reference in the initializeApp method no longer works
initializeApp();

您将不得不继续使用您目前找到的解决方法。它可能会在 SDK 的未来版本中得到解决,但目前不受支持。