写一个读取环境变量的Express中间件
来源:互联网 发布:数据展示平台 编辑:程序博客网 时间:2024/05/21 23:33
需求概述
某项目后台使用nodejs和express,前端js需要获取后台的某些配置信息,例如前端需要请求另外一个项目,需要知道它的IP、端口、应用名等信息。
常规做法
- 前端js添加一个“配置文件”:config.js,内容为固定的配置信息,例如
var config = { "other_app_host": "192.168.100.100", "other_app_port": "8080", "other_app_name": "OtherApp", ... }
- 引入该“配置文件”,即引入config全局变量,js代码中直接使用该变量
这样做有几个问题:
- 前端需要手动引入“配置文件”
- 修改配置项实际上还是修改代码,需要打包、加密
- 如果后台也需要这些配置信息,就需要前后各配置一份,一不小心就可能配置不同步
改良做法
首先,解决前后端统一的问题
目标:前后端使用同一个配置文件。
1. 我们在后台修改config.js文件:
module.exports = { "other_app_host": "192.168.100.100", "other_app_port": "8080", "other_app_name": "OtherApp", ... }
- 然后我们编写express中间件,来处理前端请求
... var app = express(); app.get("/config.js", function(req, res){ var config = require("./config.js") res.send("var config = " + JSON.stringify(config)); }); app.listen(3000);
到这里我们解决了前后端统一的问题,统一使用config.json来设置配置信息。
前端使用
然后,解决硬编码的问题
目标:修改配置信息后无需打包、加密
需要做的是把这些配置项改为读取环境变量(或参数),而非固定值。
1. 修改config.js文件:
module.exports = { "other_app_host": process.env.OTHER_APP_HOST || "192.168.100.100", "other_app_port": process.env.OTHER_APP_PORT || "8080", "other_app_name": process.env.OTHER_APP_NAME || "OtherApp", ... }
- 设置环境变量:
$ export OTHER_APP_HOST=...
- 启动应用
略
process.env.NAME是后台读取环境变量的方式,如果是启动参数,可以用process.argv[1]这种方式来获取。
最后,解决前端自动引入的问题
目标:前端页面无需使用
app.get("/*.html", function(req, res){ var html = fs.readFileSync(path.join(__dirname, req.path)); var $ = cheerio.load(html); var script0 = $("script").length > 0 ? $("script").eq(0) : null; if(script0 != null){ $("<script type='text/javascript'>" + "var config = " + JSON.stringify(require('./config')) +";" + </script>\n").insertBefore(script0); } res.send($.html());})
cheerio 是一个精简版的 jquery 库,需用 require(‘cheerio’) 引入,可用于在后台操作 Dom 。
至此,我们完成了前边三个问题的改进,实现了:
- 前端无需显示引入配置信息
- 配置信息与代码分离
- 前后台共用一套配置信息
进一步优化
- 将匿名函数提取为config-parser.js,进行模块化管理
- config-parser.js添加路径参数,指定需要处理的请求路径
- config-parser.js添加命令行参数读取(目前为读取环境变量)
- config-parser.js添加配置文件路径参数,指定配置文件所在路径
- config-parser.js添加更多类型的配置文件支持(json、properties、txt、xml)
- config-parser.js添加配置文件读取模式参数,每次都读取、或系统启动时读取一次
- …
未完待续…
0 0
- 写一个读取环境变量的Express中间件
- express里的中间件
- 怎样给connect/express.js写中间件
- 深入理解express的中间件
- express的中间件basicAuth详解
- express的中间件use,Router
- express 中间件
- express 中间件
- nodesj中 中间件express-session的理解
- Express错误处理中间件的参数使用
- Express 4.x中间件express-session的详细解析
- php利用yield写一个简单中间件
- Nodejs express之中间件
- Express validate 中间件
- Express中间件-01: 入门
- express 4中间件迁移
- express常用中间件
- express中间件--Morgan
- c#实现程序自重启
- linux sleep命令学习
- linux下给目录下所有子目录和文件赋权
- 【js设计模式笔记---装饰者模式】
- Linux 如何判断哪个网卡是否连接网线
- 写一个读取环境变量的Express中间件
- 苹果充值常见的刷单手段和防范方法
- 深度学习之Caffe(一) 用c++接口提取特征后用SVM分类
- Linux无法挂在ntfs格式设备
- <HeadFirst_HTML与CSS> O'REILLY_Chap.2_认识HTML中的"HT"
- linux虚拟机加载U盘
- ruhe解决秒杀的性能问题和超卖的讨论
- windows根据网络时间同步
- request.getParameter的值为空 分析