节点服务器启动时解析 json 对象

Parse json object when node server is started

我需要在节点server.js(这是我程序的入口点)启动时解析json对象,json文件的解析是不同的我项目中的模块。 我有两个问题

我有多个 JSON 个文件

更新以使其更清楚

如果我在加载 server/app(server.js 文件)时读取 3 个 json 文件对象(每个 50 行),我想这会很快。我的情况是,快速调用的有效路径列表在此 json 文件

app.get('/run1', function (req, res) { res.send('Hello World!'); });

所以 run1 应该在 json 文件中 定义 (如 路径的白名单 )如果用户将 run2我没有定义我需要提供错误所以我认为当服务器准备好执行这个调用并保持这个对象与所有配置有效路径并且当用户进行调用时只得到这个已经解析的对象(当服务器加载时)并且验证它是否正常,我认为它是更好的方法,而不是在调用时执行此操作

更新 2

我会尝试解释得更简单。 假设您有 白名单 您应该收听的路径, 像 run1

app.get('/run1', function

这些路径列表在您项目中特定文件夹下的 jsons 文件中定义,在每次通过 express 调用您的应用程序之前,您应该验证请求的路径是否在 [= 的路径列表中63=]。 这是给定的。现在该怎么做。

目前我开发了一个模块,它在其中寻找 json 文件,并查找那里是否存在特定路径。

现在我认为正确的解决方案是当节点应用程序启动时调用此功能并在某个对象中保留有效路径列表,我可以在用户调用期间非常容易地访问这些对象并检查路径是否存在。

我的问题是当节点应用程序(Server.js)准备好提供这个对象时,如何向验证器模块提供一些事件。

如果它是应用程序初始化的一部分,那么您可以使用 fs.readFileSyncJSON.parserequire 同步读取和解析此 JSON 文件:

var config = require('path/to/my/config.json');

只需确保在 app.listen 调用之前,您的应用程序根目录中需要处理此 JSON 加载的模块。

在这种情况下,JSON 数据将在您的服务器启动时加载和解析,您无需为回调或事件发射器而烦恼。

我看不到异步加载初始配置有任何好处,原因有二:

  1. JSON解析的瓶颈在于解析器本身,但由于它是同步的,所以你在这里不会有任何收获。因此,您唯一能够优化的部分是与文件系统的交互(即从磁盘读取数据)。
  2. 在加载此数据之前,您的应用程序将无法正常工作。

更新

如果由于某种原因您无法同步初始化,您可以延迟启动应用程序,直到初始化完成。

这里最简单的解决方案是将 app.listen 部分移到初始化回调中:

// initialization.js
var glob = require('glob')
var path = require('path')

module.exports = function initialization (done) {
  var data = {}

  glob('./config/*.json', function (err, files) {
    if (err) throw err
    files.forEach(function (file) {
      var filename = path.basename(file)
      data[filename] = require(file)
    })
    done(data);
  })
}
// server.js
var initialization = require('./initialization')
var app = require('express')()

initialization(function (data) {
  app.use(require('./my-middleware')(data))
  app.listen(8000)
})

另一种解决方案是使用简单的事件发射器来表示您的数据已准备就绪:

// config.js
var glob = require('glob')
var path = require('path')
var events = require('events')

var obj = new events.EventEmitter()
obj.data = {}

glob('./config/*.json', function (err, files) {
  if (err) throw err
  files.forEach(function (file) {
    var filename = path.basename(file)
    obj.data[filename] = require(file)
  })
  obj.emit('ready')
})

module.exports = obj
// server.js
var config = require('./config')
var app = require('express')()

app.use(require('./my-middleware'))

config.on('ready', function () {
  app.listen(8000)
})