为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在不评估它们的情况下读取 Javascript/Typescript 中的对象值吗?

我可以在不评估它们的情况下读取 Javascript/Typescript 中的对象值吗?

浮云间 2022-06-16 16:39:55
我有这个模块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 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

这是一个想法:


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

}


查看完整回答
反对 回复 2022-06-16
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信