前言
今天有写一个脚本,作用是将一个配置文件的配置参数通过脚本整理成一个json文件,其中有个需求:某些配置参数是获取的环境变量,我需要将这个环境变量的key整理到json对象中(我的本地没有配置相应的环境变量),脚本已运行获取到的变量就是undefined,无法拿到代码里面的键,经过一番google后发现可以使用proxy来实现这个需求;
Proxy 也就是代理,可以当做访问对象时的一个钩子,可以过滤很多操作。
MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
实际应用
//需求: 根据现在代码获取用到的环境变量的键(没有配置环境变量) const config = { service: { port: 9000 }, mysql: { host: "mysql", user: process.env["MYSQL_USERNAME"], password: process.env["MYSQL_PASSWORD"], database: process.env["MYSQL_DATABASE"] }, mq: { url: "mq:1234", user: process.env["MQ_USERNAME"], password: process.env["MQ_PASSWORD"] }, }; let key = config.mysql.user; console.log(key); // 打印输出: // undefined
使用proxy重载process.env的get接口
process.env = new Proxy({}, { //获取对象 get: function(target, name, receiver) { if (!(name in target)) { console.log("Getting '" + name + "'"); return name; } return Reflect.get(target, name, receiver); }, //声明新的子对象 set: function(target, name, value, receiver) { if (!(name in target)) { console.log("Setting'" + name + "',value: " + value); } return Reflect.set(target, name, value, receiver); } }); const config = { service: { port: 9000 }, mysql: { host: "mysql", user: process.env["MYSQL_USERNAME"], password: process.env["MYSQL_PASSWORD"], database: process.env["MYSQL_DATABASE"] }, mq: { url: "mq:1234", user: process.env["MQ_USERNAME"], password: process.env["MQ_PASSWORD"] }, }; let key = config.mysql.user; console.log(key); /** 打印输出: Getting 'MYSQL_USERNAME' Getting 'MYSQL_PASSWORD' Getting 'MYSQL_DATABASE' Getting 'MQ_USERNAME' Getting 'MQ_PASSWORD' MYSQL_USERNAME */
从输出可以看到下面的key已经成功拿到要访问对象的键