【Express.js】全局变量与配置文件

全局变量与配置文件

通常我们会将一些项目的配置信息写在一个文件内,然后读入内存并使用。在 express 中使用全局变量有多种方案,我们一起看看有哪些常用的方案

准备工作

拷贝第一节的HelloWorld项目

准备一个Resp.js模块:

module.exports = {Ok: (...args)=>{return {code: 200,msg: args[0]?args[0]:"Ok",data: args[1]?args[1]:null}}
}

global

global对象中挂载我们需要全局共享的量,比如我们想要挂载一个全局的config作为整个express应用的配置,就在项目的唯一入口文件(如: index.js, app.js等)的最顶上(优先于任何模块)设置一次:

// index.js
global.config = {appname: "GlobalVar"
}
/** 更简洁的写法,隐变量,首次被执行到后,会自动挂载到全局
config = {appname: "GlobalVar"
}
*/
//创建app应用...

这样我们就可以在其它任何地方调用config,比如新建一个router.js挂载到express应用上去

// router.js
const routes = require('express').Router();
routes.get('/global', (req, res, next)=>{res.send(Resp.Ok("global中的全局变量", {"appname":config.appname}));
});module.exports = routes;// index.js
app.use(routes);

如果我们有很多需要全局共享的配置,挤在index.js的上方多少有点不雅观,那我们可以把它们写在一个文件里,然后在index.js最顶上引入一下

// global.js
global.config = {appname: "GlobalVar"
}// index.js
require('./global');

**注意:**由于global中的变量是可以直接以变量名xxx调用的,无需global.xxx,如果变量名设置的比较普通,就比如上面的config,甚至更简单的a之类的,很可能跟其它模块中定义的临时变量冲突,造成变量污染,因此在global上挂载变量时取名一定要特殊点,比如:之前的config替换为__config

global.__config = {appname: "GlobalVar"
}

优点:

  • 调用很便捷

缺点:

  • 可能变量污染
  • 没有代码提示,不心安

module

自定义一个module,存放一些变量,在需要的地方进行引入
比如:我们自建一个config.js

// config.js
module.exports = {appname: "GlobalVar"
}

在router.js中引入config.js

// router.js
const CONFIG = require('./config');routes.get('/module', (req, res, next)=>{res.send(Resp.Ok("config模块当作全局变量", {"appname":CONFIG.appname}));
});

优点:

  • 能有代码提示
  • 无变量污染

缺点:

  • 每次都要引入,比较麻烦

app.set

在 express 的应用设置表中设置应用内的全局变量:

// index.js
app.set("appname", "GlobalVar");

在其它地方调用app,如挂载在app上的router:

// router.js
routes.get('/app', (req, res, next)=>{res.send(Resp.Ok("app中的'全局'变量", {"appname":req.app.get("appname")}));
});

在挂载在app下的子应用中,调用父app中的设置,当某字段在子应用中没有设置时,会继承父应用中的字段

//subapp.js
const app = require('express')();
const Resp = require('./Resp');
//当子应用没有设置时,会继承父应用中设置的字段
// app.set('appname', "subapp");
app.all('/', (req, res, next) => {res.send(Resp.Ok("子应用获取父应用中的全局变量", {appname: req.app.get("appname")}));
})module.exports = app;//index.js
const subapp = require('./subapp');
app.use('/subapp',subapp);

优点:

  • 能有代码提示

process.env

在进程的环境变量中挂载全局变量:

//index.js
process.env.appname = "GlobalVar";

在其它地方调用process.env.appname

// subapp2.js
const app = require('express')();
const Resp = require('./Resp');app.all('/', (req, res, next) => {// console.log(app.settings.env);res.send(Resp.Ok("在process.env上挂载全局变量", {appname: process.env.appname}));
})module.exports = app;//index.js
const subapp2 = require('./subapp2');
app.use('/process.env',subapp2);

缺点:

  • 没有代码提示,不心安

json

以上的方案都是将配置信息写在js文件中的,对于一个正规的项目来说多少有点儿戏,毕竟写在js中的变量是很容易就能被改变的。绝大多数时候,配置信息是需要变化也不允许变化的,我们只需要静态的信息即可。在Js项目中,经常用json文件作为静态配置文件。

新建一个config.json文件:

{"appname": "GlobalVar"
}

在我们的router中新加一条测试一下,不管你在哪里require,在首次被require之后,修改json文件内容将不会再产生影响

routes.get('/json', (req, res, next)=>{let configJson = require('./config.json');res.send(Resp.Ok("json静态配置文件", {"appname":configJson.appname}));
});

json文件不支持注释,如果想要注释,要么曲线救国(加与被备注键相关的键值对),要么使用Json5规范

npm install json5

新建一个config.json5文件:

{"appname": "GlobalVar"  //应用名
}

接着在项目的入口文件中引入register,会挂载到全局:

require('json5/lib/register');

之后require就可以解析json5文件了:

routes.get('/json5', (req, res, next)=>{let configJson5 = require('./config.json5');res.send(Resp.Ok("json5静态配置文件", {"appname":configJson5.appname}));
});

yaml

相比.json文件,.yaml(或.yml)文件是更加现在的配置文件,json文件有着严格的格式要求,yaml(yml)书写起来则更加自然
新建一个config.yaml文件:

# 应用名
appname: GlobalVar  # 应用名

在nodeJs中读取yaml需要借助fsjs-yaml

npm install fs
npm install js-yaml

把fs挂载到全局即可(之前的global.js),一般情况下也不会取fs这样的局部变量名,如果需要频繁的操作文件,挂载到全局后会方便很多:

global.fs = require('fs');

在router.js中引入js-yaml并新建一个测试路由:

const yaml = require('js-yaml');routes.get('/yaml', (req, res, next)=>{/*Object */let configYaml = yaml.load(fs.readFileSync('./config.yaml'));res.send(Resp.Ok("yaml动态配置文件", {"appname":configYaml.appname}));
});

由于是通过fs读取yaml文件的,因此在改变yaml文件中的内容后,访问路由的结果也会变


本文总共介绍了6种方案,在项目具体采用哪种并没有绝对的说法,因地制宜即可。

下一节-错误分类和日志分级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mongodb 对嵌套文档数组进行查询操作

查询非嵌套文档数组 非嵌套文档的数组,数组由数字、字符串等元素组成。 以下方法对数组字段进行查询操作的示例,包括对数组匹配查询,元素的增、删、改操作,空数组、非空数组查询等。 测试数据 连接到 mongodb 数据库&#xff0…

Bean 作用域与生命周期

Bean 作用域与生命周期 ​ 对于 Spring 来说,核心操作对象就是存和取 Bean ,接下来就 Bean 的作用域与生命周期进行探讨。 文章目录 Bean 作用域与生命周期一、作用域的定义1.1、Bean 的6种作用域1.2、Bean作用域设置方法 二、Bean 的生命周期2.1、Bean…

postgresql还原bak

1、第一步肯定是要新建自己还原的目标数据库,例如: 2、进入postgresql的安装目录下的bin目录下 然后地址栏输入cmd进入命令 输入以下 psql -h localhost -U postgres -p 5432 -d SamsinoYardStandard_karamay -f "D:\desktop\zk\20230628.bak&quo…

verilog实现数码管静态显示

文章目录 verilog实现数码管静态显示一、任务要求二、实验代码三、仿真代码四、仿真结果五、总结 verilog实现数码管静态显示 一、任务要求 六个数码管同时间隔0.5s显示0-f。要求:使用一个顶层模块,调用计时器模块和数码管静态显示模块。 二、实验代码…

将Spring Boot项目打包部署到阿里云linux服务器

首先 你要保证自己的服务器上有java环境 如果没有可以参考我的文章 linux服务器中安装java JDK1.8版本 然后 我们打开我们的Spring Boot项目 双击 package 生命周期进行打包 打包完成之后 我们找到 target 下面会有一个jar包 然后 我们右键它 如下图操作 系统就会帮你打开它所…

OpenCV for Python 学习第四天 :通道的获取与合并

上一篇博客,我们学习了如何通过更快的item()和itemset()的方法访问图片,以及了解了图像的兴趣位置的获取方法,那么今天,我们将学习通道的处理方法,通过通道的拆分和合并的实例,让大家更好的了解咱们有关于B…

STM32知识合集

目录 STM: GPIO: 串口通信协议: 1.USART: 2.I2C: 3.Modbus 4.RS232 5.RS485: SPI通信协议 万用表使用: 中断系统: NVIC: EXTI : 时钟系统&…

前端笔记_OAuth规则机制下实现个人站点接入qq三方登录

文章目录 ⭐前言⭐qq三方登录流程💖qq互联中心创建网页应用💖配置回调地址redirect_uri💖流程分析 ⭐思路分解⭐技术选型实现💖技术选型:💖实现 ⭐结束 ⭐前言 大家好,我是yma16,本…

JMeter做http接口功能测试

1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求;填写服务器域名或IP;方法选GET;填写路径;添加参数;运行并查看结果。 2. 以Json串传参的post请求 e.g. 获取用户余额 添加http请求;…

设计模式-原型模式

目录 一、传统方式 二、原型模式 三、浅拷贝和深拷贝 克隆羊问题: 现在有一只羊tom,姓名为: tom,年龄为: 1,颜色为: 白色,请编写程序创建和tom羊属性完全相同的10只羊。 一、传统方式 public class Client {public static vo…

WMTS 地图切片Web服务 协议数据解析

1. WMTS 描述 WMTS(Web Map Tiles Service):地图切片Web服务。 2. 数据示例: arcgis online 导出的wmts xml: https://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS 内容解析: contents中可能包…

linux原生安装mongodb

1.下载tgz文件,解压缩并将文件夹重命名为mongodb wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz 2.新建存储目录 #数据存储目录 mkdir -p /mongodb/single/data/db #日志存储目录 mkdir -p /mongodb/single/log 3.编辑配置文件(默认进去先…

J2EEJSP自定义标签库01out标签if标签

目录 一.什么是标签 二.JSP自定义标签库 2.1 JSP标签库是什么 2.2 处理流程 2.3 如何自定义标签 2.4 标签类型 三.开发示例 3.1 out标签 1.创建助手类 2.编写tld(标签库的描述)文件,(必须放在WEB-INF目录或其目录下&a…

Jenkins升级指南 LTS2.361.1

近期要在Jenkins中新增jacoco,对老旧Jenkins进行升级,碰到的一些问题汇总。 jenkins配置说明 主目录,可在Configure System中查看,一般在:/var/lib/jenkinswar包目录,可在linux启动程序充查看&#xff0c…

XML简介及操作

目录 1.XML简介 2.XML解析-DOM4J 1.XML简介 XML(EXtensible Markup Language),可扩展标记语言特点: XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换作用: 数据交换配置应用程序和网站Ajax基石 HTML 与 XML …

python爬虫-获取headers(报文头)关键参数实例小记

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:请求页面,得到响应。建议首次请求时headers内容都带着,调试…

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了,所以此处用箭头函数()》{}才会在点击时执行或者 遍历数据使用map来遍历,使用forea…

Docker【安装与基本使用】

【1】Docker的安装 注意:如果之前安装过docker其他版本,请删除干净。 docker-01 10.0.0.51 2G docker-02 10.0.0.52 2G docker-01 [rootdocker-01 ~]# cp -rp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cp: overwrite ‘/etc/localtime’? …

如何查询企业诉讼信息?

如何免费查询企业诉讼信息? 企业的司法诉讼信息可以通过中国裁判文书网、中国执行信息公开网、中国庭审公告网去查询。 在这些网站上你可以通过输入企业名称或者注册号来查找相关的法律信息。大多数的法律诉讼信息都会在这些网站上公开,也会有一些特殊…

MyBatis代理开发:简化数据访问层(DAO)的实现

引言 在现代的应用程序开发中,数据访问层(DAO)是连接应用程序与数据库之间的关键组件。MyBatis是一个流行的Java持久层框架,提供了一种简化数据访问层开发的方法,即代理开发。本文将介绍MyBatis代理开发的概念和使用方…