Могу ли я прочитать значения объектов в Javascript / Typescript без их оценки? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть этот модуль

export default () => ({
  environment: process.env.ENVIRONMENT,
  port: process.env.PORT
  database: {
    host: process.env.DATABASE_HOST,
    port: process.env.DATABASE_PORT,
    username: 'postgres',
    password: process.env.DATABASE_PASSWORD,
    database: process.env.DATABASE_NAME,
  },
  awsSqsDefaultQueueUrl: process.env.AWS_SQS_DEFAULT_QUEUE_URL,
  sqsEndpoint: process.env.SQS_ENDPOINT,
})

Я хочу прочитать его и создать объект с плоским ключом / значением, который выравнивает свои ключи, только если значение начинается с process.env, например:

{
  ENVIRONMENT: configuration().environment,
  PORT: configuration().port,
  DATABASE_HOST: configuration().database.host
  DATABASE_PORT: configuration().database.port
  ...
}

database.username не будет в новом ключе объекта, поскольку его значение не начинается с process.env.

Единственный способ думать, где я могу прочитать значение ключа без его оценки, - загрузить файл в виде строки и затем проанализировать его с помощью регулярных выражений. Но это неправильно.

Есть ли лучший способ добиться этого?

1 Ответ

0 голосов
/ 06 апреля 2020

Вот идея:

const settings = () => ({
    environment: process.env.ENVIRONMENT,
    port: process.env.PORT,
    database: {
        host: process.env.DATABASE_HOST,
        port: process.env.DATABASE_PORT,
        username: 'postgres',
        password: process.env.DATABASE_PASSWORD,
        database: process.env.DATABASE_NAME,
    },
    awsSqsDefaultQueueUrl: process.env.AWS_SQS_DEFAULT_QUEUE_URL,
    sqsEndpoint: process.env.SQS_ENDPOINT,
});

function parseEnvSettings() {
    // test values
    process.env.ENVIRONMENT = "TEST";

    const str = settings.toString();
    const pattern = /process\.env\.[a-zA-Z0-9_]+/g;

    // get your property names
    const matches = [...str.match(pattern).values()];

    // build your flat settings object
    const parsedSettings = {};
    matches.forEach(property => {
        parsedSettings[property.substr(property.lastIndexOf(".") + 1)] = eval(property);
    });

    // here you go
    console.log(parsedSettings);
}

parseEnvSettings();

Производит:

{
  ENVIRONMENT: 'TEST',
  PORT: undefined,
  DATABASE_HOST: undefined,
  DATABASE_PORT: undefined,
  DATABASE_PASSWORD: undefined,
  DATABASE_NAME: undefined,
  AWS_SQS_DEFAULT_QUEUE_URL: undefined,
  SQS_ENDPOINT: undefined
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...