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

时间:2015-08-02 14:42:14

标签: javascript node.js express eventemitter

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

  • 是否建议使用server.js文件中的event调用parse函数
  • 我读了一下event.emiter,但不知道如何调用函数 来自不同的模块...示例将非常有用

我有多个JSON文件

更新以使其更清晰

如果我在加载服务器/应用程序(server.js文件)时读取3个json文件对象(每行50行),我想这会很快。我的场景是快速调用的有效路径列表在这个json文件中

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

所以run1应该在json文件中定义(如路径的白名单),如果用户输入我未定义的run2我需要提供错误,所以我认为当服务器完成此调用并保持此obj具有所有配置有效路径时,当用户进行调用时,只需获取此对象(当服务器已加载时)并验证其是否正常,我认为其更好的方法是做随叫随到

更新2

我会尝试解释更简单。 让我们假设您有白名单的路径,你应该听, 比如run1

app.get('/run1', function

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

目前我正在开发模块,在其中搜索json文件并查找是否存在特定路径。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

在这种情况下,JSON数据将在服务器启动时加载和解析,并且不需要使用回调或事件发射器来解决问题。

由于以下两个原因,我无法看到异步加载初始配置的任何好处:

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

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

    这里最简单的解决方案是将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)
    })