gpt4 book ai didi

javascript - 导入的 typescript 类的实例化似乎不起作用

转载 作者:行者123 更新时间:2023-12-03 00:09:37 25 4
gpt4 key购买 nike

当我遇到这个场景时,我正在使用 Typescript 编写 NodeJS 服务器端代码。我创建了一个类 Secret 来为我提供环境变量集。就是这样。

import Logger from './logger';
import dotenv from 'dotenv';
import * as fs from 'fs';
class Secret {

private ENVIRONMENT: string;

public constructor() {
this.setEnvironmentVaribales();
}

private setEnvironmentVaribales(): void {
if (fs.existsSync('.env')) {
Logger.logError('Using .env file to supply config environment variables');
dotenv.config({ path: '.env' });
} else {
Logger.debug('Using .env.mm file to supply config environment variables');
dotenv.config({ path: '.env.mm' });
}
this.ENVIRONMENT = process.env['NODE_ENV'];
}

public get environment(): string {
return this.ENVIRONMENT;
}
}

export default Secret;

然后,我将 Secret 导入到“Logger”,在其中初始化记录器。这是logger.ts

中的代码
import  * as Winston from 'winston';
import Secret from './secret';

class Logger {
private logger: Winston.Logger;
private secret: string;
public constructor() {
this.secret = new Secret().environment;
console.log(this.secret);
this.initializeLogger();
}

/**
* Initializes the winston logger
*/
private initializeLogger(): void {
this.logger = Winston.createLogger({
transports: [
new (Winston.transports.Console)({
level: Secret.ENVIRONMENT === 'production' ? 'error' : 'debug'
}),
new (Winston.transports.File)({
filename: 'debug.log',
level: 'debug'
})
]
});

if (Secret.ENVIRONMENT !== 'production') {
this.logger.debug('Logging initialized at debug level');
}
}
}

export default new Logger();

问题是我没有在 this.string 中获得预期的值。事实上,Secret 的新实例似乎并未生成。我得到 undefined 作为 Loggerenvironment 变量的结果。我在这里做错了什么吗?它似乎对我有用的唯一方法是当我将我的 Secret 更改为这样导出时。

import Logger from './logger';
import {dotenv} from 'dotenv/config';
import * as fs from 'fs';

if (fs.existsSync('.env')) {
Logger.logError('Using .env file to supply config environment variables');
dotenv.config({ path: '.env' });
} else {
Logger.debug('Using .env.mm file to supply config environment variables');
dotenv.config({ path: '.env.mm' });
}
export const ENVIRONMENT = process.env['NODE_ENV'];

或者是循环依赖阻止了它。 Secret 中的 LoggerLogger 中的 Secret。如果是这种情况,我什至尝试从 Secret 中删除 Logger 导入并使用 console.log()。但是,仍然无法按照我想要的方式工作。

最佳答案

是的,这里存在循环依赖:

  • logger.ts ,导出的成员是 Logger 的实例:export default new Logger()
  • 在类的构造函数中Logger ,类(class)Secret被实例化:new Secret().environment
  • 在类的构造函数中Secret ,成员(member)setEnvironmentVaribales()被调用,它使用 Logger 的导出实例同步。

您当前的解决方案也无效:

if (fs.existsSync('.env')) {
Logger.logError('Using .env file to supply config environment variables');
dotenv.config({ path: '.env' });
} else {
Logger.debug('Using .env.mm file to supply config environment variables');
dotenv.config({ path: '.env.mm' });
}
export const ENVIRONMENT = process.env['NODE_ENV'];

在这里,Logger不能有 ENVIRONMENT 的内容在导出之前。

解决方案

最好的解决方案是不要从 secret.ts 导入记录器,因为Logger需要先完整执行这个文件的内容。

如果您确实需要交叉引用,那么如果您的类不从其构造函数中相互使用,它就会起作用。

无论如何,如果记录器在完成其工作之前需要该 secret ,则您不能要求它先工作以向其提供该 secret 。

关于javascript - 导入的 typescript 类的实例化似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54802548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com