4

我们正在开发一个使用 Firebase 作为其后端的 Ionic 混合应用程序。为此,我们使用 npm 包angularfire2

我们有两个数据库,一个用于开发,另一个用于生产,因此我们希望根据应用程序的状态交换它们。

为此,我们创建了一个布尔静态常量 ( IS_PRODUCTION_ENVIRONMENT),根据它的值,它会发生变化FIREBASE_CONFIG,它是包含数据库配置数据的变量。

这是我们app.config.ts文件中的重要数据:

    export class AppConfig {

        public static readonly IS_PRODUCTION_ENVIRONMENT = false;

        public static readonly FIREBASE_CONFIG_DEVELOPMENT = {
            apiKey: "",
            authDomain: "",
            databaseURL: "",
            projectId: "",
            storageBucket: "",
            messagingSenderId: ""
        };

        public static readonly FIREBASE_CONFIG_PRODUCTION = {
            apiKey: "",
            authDomain: "",
            databaseURL: "",
            projectId: "",
            storageBucket: "",
            messagingSenderId: ""
        };

    public static readonly FIREBASE_CONFIG = AppConfig.IS_PRODUCTION_ENVIRONMENT ? 
AppConfig.FIREBASE_CONFIG_PRODUCTION : AppConfig.FIREBASE_CONFIG_DEVELOPMENT;

...

这是调用app.module.ts

imports: [
...
   AngularFireModule.initializeApp(AppConfig.FIREBASE_CONFIG),
...
]

知道了这一点,我们的问题是,当我们启动带有--prod --release标志的应用程序时,如果我们想构建它或者只是在某些设备上测试它;例如,使用 时ionic cordova run browser --prod --release,Firebase 始终使用生产配置 ( FIREBASE_CONFIG_PRODUCTION) 进行配置,就好像IS_PRODUCTION_ENVIRONMENT设置为一样true,但事实并非如此。

在不同的文件中插入console.logs,我们意识到,在生产模式下构建应用程序后,IS_PRODUCTION_ENVIRONMENTFIREBASE_CONFIG显示正确的值。但是,Firebase 生产数据库仍然像IS_PRODUCTION_ENVIRONMENTwas一样配置true,尽管不是。

第一个配置错误的可跟踪日志来自 file firebase.app.module.js,来自angularfire2包的文件,其方法config中的变量initializeApp()接收的值FIREBASE_CONFIG_PRODUCTION(好像IS_PRODUCTION_ENVIRONMENT设置为true),即使FIREBASE_CONFIG指向FIREBASE_CONFIG_DEVELOPMENT.

如果我们FIREBASE_CONFIG直接指向生产或开发(没有三元条件运算符),则不会重现该问题,因此我们认为,出于某种原因,在类 100% 构建initializeApp()之前使用,并且一如既往地考虑。AppConfigIS_PRODUCTION_ENVIRONMENTtrue

此外,如果我们使用ionic serveor启动应用程序进行测试ionic run,该应用程序将正常运行,并使用所选配置启动 Firebase 数据库。--prod --release因此,该问题仅在使用标志构建时发生。

有谁知道解决这个问题的方法,或者另一种编码方法?

谢谢!

4

1 回答 1

0

好吧,我们终于解决了。

这是一个奇怪的问题,因为我们所要做的就是声明IS_PRODUCTION_ENVIRONMENTexport const类的外部,并从内部操纵它。app.config.ts(缩短):

export const isProdEnvironment = true;

export class AppConfig {

    public static readonly IS_LOGGER_ENABLED = !isProdEnvironment;

    public static readonly FIREBASE_CONFIG_PRODUCTION = {
        apiKey: "",
        authDomain: "",
        databaseURL: "",
        projectId: "",
        storageBucket: "",
        messagingSenderId: ""
    };

    public static readonly FIREBASE_CONFIG_DEVELOPMENT = {
        apiKey: "",
        authDomain: "",
        databaseURL: "",
        projectId: "",
        storageBucket: "",
        messagingSenderId: ""
    };

    public static readonly FIREBASE_CONFIG = isProdEnvironment ? 
    AppConfig.FIREBASE_CONFIG_PRODUCTION : AppConfig.FIREBASE_CONFIG_DEVELOPMENT;

...

因此,最后,看起来这是打字稿编译 a 的方式public static readonly boolean的问题,而不是在运行时如何解释三元条件运算符的问题。

于 2018-03-02T13:01:57.133 回答