共计 1568 个字符,预计需要花费 4 分钟才能阅读完成。
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 文件也默认一个空数据吧。
正文完