热门标签: 转载 JavaScript mysql 学习 php
主页> 前端 >

JS——使用proxy代理对象访问接口

发布时间:2019-11-05 编辑:三石兄 标签: JavaScriptnode.js 热度:104

使用proxy拦截对指定对象访问的操作,实现一些自定义操作

前言


今天有写一个脚本,作用是将一个配置文件的配置参数通过脚本整理成一个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已经成功拿到要访问对象的键

Copyright © 2017-2018 三石兄博客 & 版权所有

蜀ICP备17023832号

230552