Node.js无法始终从我的配置文件中获取值

时间:2018-03-08 08:46:45

标签: javascript node.js

我在服务器端使用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是否缓存或返回版本号的随机值。

我该如何处理这个问题?谢谢。

1 个答案:

答案 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'
})