Nodejs 中可以在 global
下挂载一些全局变量,但是大家都不推荐这么写。
因为nodejs服务是单线程的,所以global变量本地全局变量,无法完成响应变量的目的,也就是说本地变量与请求无关,只与当前进程有关。
在做一些小东西的时候,也需要维护一些全局的变量。一般情况,可以存到数据库,但是反反复复查询数据库,感觉不是很好。
于是,把一些零碎的数据放置到某个模块内部维护,需要的试试,直接拿,很方便。
var DATE = {}
module.exports = DATE
最开始,是这样向外暴露一个对象,以为修改就会得到对应的改变,但发现不行。
第一次修改
var DATE = {}
const getData = (key) => {
return DATE[key] || null
}
const updateDate = (key, newData) => {
DATE[key] = newData
}
module.exports = {
getData,
updateDate
}
其他模块只需要引入该模块,就能获取/修改内部 DATE
的数据。
目前已经实现了对一个全局零碎数据的维护、使用,但是,一旦服务重启,数据都消失了。
再把数据当做文件保存到服务器上如何呢,很好的样子。
|-- 根目录
|--|-- config
|--|--|-- config.json // 可能使用的零碎数据
|--|--| lib
|--|--|-- base-data.js // 维护数据模块
base-data.js
let fs = require('fs')
let path = require('path')
let BaseDate = {}
const getFilePath = (fileName) => {
return path.join(__dirname, '..', 'config', `${fileName}.json`)
}
const getData = (fileName) => {
return new Promise((resolve, reject) => {
if (BaseDate[fileName]) {
resolve(BaseDate[fileName])
} else {
fs.readFile(getFilePath(fileName), (err, data) => {
if (err) {
console.error(`获取${fileName}失败`, err)
reject(err)
} else {
BaseDate[fileName] = JSON.parse(data)
resolve(BaseDate[fileName])
}
})
}
})
}
const updateData = (fileName, newDate) => {
return new Promise((resolve, reject) => {
fs.writeFile(getFilePath(fileName), JSON.stringify(newDate), (err) => {
if (err) {
console.error(`生成新${fileName}失败`, err)
reject(err)
return
}
BaseDate[fileName] = newDate
console.info(`生成新的${fileName}`, BaseDate[fileName])
resolve(BaseDate[fileName])
})
})
}
module.exports = {
getData,
updateData
}
感觉上已经比较不错,以本地 json
文件为储存元素,一旦修改某个内容,就重新生成一个文件,即使重启也不会丢失。已经拿到的数据一直缓存在程序中,可以直接使用。
需要注意,如果文件不在会报错,目前没有处理文件不存在的报错。假若清空数据,也需要是一个
{}
空对象这样的格式,JSON.stringify 有点不能处理空字符串的样子,同理,空 json 文件也默认一个空数据吧。