我在服务器端使用node.js。我有一个RESTful服务,如;
app.get('/getAndroidVersion', function(req,res){res.json({version: config.androidVerion});});
此服务必须从配置文件返回版本值。虽然我正在更改配置文件node.js中的androidVerion
值,但会从配置值返回不同的值。例如,在配置文件中,版本值为2,但node.js返回3.
更改配置文件中的版本值后,我在服务调用之前编写了一个console.log语句,如
app.get('/getAndroidVersion', function(req,res){console.log(config.androidVerion)
res.json({version: config.androidVerion});
});
它还将配置文件中的不同值写入控制台。问题是什么? node.js是否缓存或返回版本号的随机值。
我该如何处理这个问题?谢谢。
答案 0 :(得分:3)
require
的来电已缓存。
来自Node.js: Modules docs:
模块在第一次加载后进行缓存。这意味着(除其他外)每次调用require(' foo')将获得完全相同的返回对象,如果它将解析为同一文件。
你有很多选择:
fs.readFile
您可以使用readFile
代替require,从磁盘读取每个请求的配置文件。这可确保您始终获得最新版本的文件。
如果这是一个高流量的应用,您可能希望将这些配置设置保留在数据库而不是文件中。数据库引擎通常会避免触及frequently executed queries的磁盘。
更进一步,你可以编写自己的机制来存储K / V对;在设置值时,此机制应保留磁盘对对象的任何更改,同时在尝试获取值时避免触摸磁盘。
这是一个(未经测试的)示例:
const fs = require('fs')
const path = require('path')
class PersistedObject {
constructor(path) {
this.path = path
this.obj = {}
}
load() {
const json = fs.readFileSync(this.path, 'utf8')
this.obj = json ? JSON.parse(json) : {}
}
set(key, value, cb) {
this.obj[key] = value
fs.writeFile(this.path, JSON.stringify(this.obj), cb)
}
get(key) {
return this.obj[key]
}
}
// Construct with a path to your config.json.
const config = new PersistedObject(path.resolve(__dirname, './config.json'))
// Load data from disk. Run this once on startup.
config.load()
// Calling `.set` sets the in-memory `obj`,
// and also persists the obj on disk.
config.set('firstName', 'Mary', (err, result) => {
// Calls to `.get` use the in-memory `obj` and do not touch the disk.
console.log(config.get('firstName')) // logs 'Mary'
})