使用require vs fs.readFile读取json文件内容

时间:2016-02-14 06:29:43

标签: javascript node.js express

假设对于来自API的每个响应,我需要将响应中的值映射到我的Web应用程序中的现有json文件,并显示json中的值。在这种情况下,读取json文件的更好方法是什么? require或fs.readfile。请注意,可能会有数千个请求同时进入。

请注意,我不希望在运行时期间文件有任何更改。

SomeInterface.test

7 个答案:

答案 0 :(得分:47)

fs.readFile有两个版本,它们是

异步版

require('fs').readFile('path/test.json', 'utf8', function (err, data) {
    if (err) 
       // error handling

    var obj = JSON.parse(data);
});

同步版

var json = JSON.parse(require('fs').readFileSync('path/test.json', 'utf8'));

使用require解析json文件,如下所示

var json = require('path/test.json');

但请注意

  • require是同步的,只读取一次文件,然后调用从缓存中返回结果

  • 如果您的文件没有.json扩展名,则不会将该文件的内容视为JSON

答案 1 :(得分:45)

我想你会JSON.parse json文件进行比较,在这种情况下,var obj = require('./myjson'); // no need to add the .json extension 更好,因为它会立即解析文件并同步:

var myObj = require('./myjson');
request(options, function(error, response, body) {
   // myObj is accessible here and is a nice JavaScript object
   var value = myObj.someValue;

   // compare response identifier value with json file in node
   // if identifier value exist in the json file
   // return the corresponding value in json file instead
});

如果您有使用该文件的数千个请求,请在请求处理程序之外请求一次,就是这样:

after_save

答案 2 :(得分:6)

由于没有人愿意编写基准测试,并且我觉得需要更快地工作,所以我自己做了。

我比较了fs.readFile(承诺版本)与require(无缓存)与fs.readFileSync。

您可以看到基准here和结果here

对于1000次迭代,它看起来像这样:

require: 835.308ms
readFileSync: 666.151ms
readFileAsync: 1178.361ms

那么您应该使用什么?答案不是那么简单。

  1. 当您需要永久缓存对象时,请使用require。最好使用Object.freeze以避免在应用程序中对其进行更改。
  2. 在单元测试中或阻止应用程序启动时使用readFileSync-最快。
  3. 在应用程序运行时使用readFile或Promisified版本,而您不想阻止事件循环。

答案 3 :(得分:2)

如果在测试中处理JSON灯具,请使用node-fixtures

  

项目将查找名为fixtures的目录,该目录必须是测试目录的子目录才能加载所有fixture(* .js或* .json文件):

// test/fixtures/users.json
{
  "dearwish": {
    "name": "David",
    "gender": "male"
  },
  "innaro": {
    "name": "Inna",
    "gender": "female"
  }
}
   
// test/users.test.js
var fx = require('node-fixtures');
fx.users.dearwish.name; // => "David" 

答案 4 :(得分:1)

{
  "country": [    
    "INDIA",
    "USA"
  ],
  "codes": [   
    "IN",
    "US"
  ]
}


//countryInfo.json

const country = require('countryInfo.json').country

const code = require('countryInfo.json').code

console.log(country[0])
console.log(code[0])

答案 5 :(得分:1)

我只想指出,require似乎将文件保留在内存中,即使应该删除变量也是如此。我有以下情况:

for (const file of fs.readdirSync('dir/contains/jsons')) {
  // this variable should be deleted after each loop
  // but actually not, perhaps because of "require"
  // it leads to "heap out of memory" error
  const json = require('dir/contains/jsons/' + file);
}

for (const file of fs.readdirSync('dir/contains/jsons')) {
  // this one with "readFileSync" works well
  const json = JSON.parse(fs.readFileSync('dir/contains/jsons/' + file));
}

由于“堆内存不足”错误,带有require的第一个循环无法读取所有JSON文件。 readFile的第二个循环有效。

答案 6 :(得分:0)

如果文件为空,则require将中断。它将引发错误:

  

SyntaxError ... JSON输入意外结束。

使用readFileSync/readFile,您可以处理此问题:

let routesJson = JSON.parse(fs.readFileSync('./routes.json', 'UTF8') || '{}');

或:

let routesJson
fs.readFile('./dueNfe_routes.json', 'UTF8', (err, data) => {
    routesJson = JSON.parse(data || '{}');
});