自定义类代理模块
可能在项目中,会有实际情况是,有个模块做什么都好。可是,实际上又需要根据实际需求,在调用方法有某些 "前置操作" 或 "后置操作"
此时需要用到的是,Proxy, 具体Docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
在本项目中,因为 redis 的client 连接会超时过期,再者,一直保持一个一直未在使用的连接也不是十分好。再由于懒惰成性,不想每次调用前都要显式的createClient() 然后完成之后 quit() 掉。
故写了一个 Helper 来代理掉这个模块的所有方法,如下
ps: 由于 return 的是一个 function,所以在这个 function 内的 arguments 为调用是的参数列表。
// redis.js
let redisPort = process.env.REDIS_PORT || "6379"; let redisHost = process.env.REDIS_HOST || "127.0.0.1"; let redis = require("redis"); let helper = {}; let handler = { get(target, property) { if (!target[property]) { target[property] = function () { let client = redis.createClient({ host: redisHost, port: redisPort }); console.log(arguments); client[property].apply(client, arguments); client.quit(); } } return target[property] } }; let proxy = new Proxy(helper, handler); module.exports = proxy;