为了抽象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:无法读取未定义的属性“initializeApp”
为了隔离这个问题,我编写了以下代码,以证明initializeApp不能像对其他函数一样导出为属性:
const firebaseAdmin = require('firebase-admin');
const initializeApp = firebaseAdmin.initializeApp;
initializeApp();这会抛出:
TypeError:无法读取未定义属性的“内部”
为什么我不能将initializeApp导出为属性?此错误迫使我将index.js中的导出重写为:
exports.initializeApp = () => firebaseAdmin.initializeApp();但这感觉像一次黑客袭击。
我的每个文件都是以'use strict;'开头的,这有什么区别吗?那将是令人惊讶的。
发布于 2021-02-19 02:14:18
这是Admin如何实现的结果。Admin包的主要导出不是真正的模块,而是类的实例。因此,当您从该类实例中提取单个方法时,它会松开它的所有上下文,并且内部引用(如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的未来版本中得到解决,但现在它不受支持。
https://stackoverflow.com/questions/66260225
复制相似问题