假设对于来自API的每个响应,我需要将响应中的值映射到我的Web应用程序中的现有json文件,并显示json中的值。在这种情况下,读取json文件的更好方法是什么? require或fs.readfile。请注意,可能会有数千个请求同时进入。
请注意,我不希望在运行时期间文件有任何更改。
SomeInterface.test
答案 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。
对于1000次迭代,它看起来像这样:
require: 835.308ms
readFileSync: 666.151ms
readFileAsync: 1178.361ms
那么您应该使用什么?答案不是那么简单。
答案 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 || '{}');
});