最新消息:看到那些跳动的图片、文字了吗?点击点击 O(∩_∩)O~~

Nodejs 维护可变全局零碎数据

若思若想 onlyling 2901浏览

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 文件也默认一个空数据吧。

转载请注明:OnlyLing - Web 前端开发者 » Nodejs 维护可变全局零碎数据