Подтвердить что ты не робот

Чтение содержимого файла json с требованием vs fs.readFile

Предположим, что для каждого ответа от API мне нужно сопоставить значение из ответа на существующий json файл в моем веб-приложении и отобразить значение из json. Каков лучший подход в этом случае для чтения json файла? require или fs.readfile. Обратите внимание, что в то же время могут появляться тысячи запросов.

Обратите внимание, что я не ожидаю, что во время выполнения будут внесены какие-либо изменения в файл.

request(options, function(error, response, body) {
   // 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
});
4b9b3361

Ответ 1

Я предполагаю, что вы будете JSON.parse json файл для сравнения, в этом случае require лучше, потому что он будет разбирать файл сразу и синхронизировать:

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
});

Ответ 2

Существуют две версии для 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, require не будет обрабатывать содержимое файла как JSON.

Ответ 3

Используйте node-fixtures при работе с приборами JSON в ваших тестах.

Проект будет искать каталог с именем fixtures, который должен быть дочерним для вашего тестового каталога, чтобы загрузить все приборы (файлы *.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

{
  "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

Я только хочу отметить, что кажется, что 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

Если ваш файл пуст, то 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 || '{}');
});