web-dev-qa-db-fra.com

Lire le contenu du fichier json avec require vs fs.readFile

Supposons que pour chaque réponse d'une API, je dois mapper la valeur de la réponse à un fichier JSON existant dans mon application Web et afficher la valeur du fichier JSON. Quelle est la meilleure approche dans ce cas pour lire le fichier json? nécessite ou fs.readfile. Notez qu'il peut y avoir des milliers de demandes qui arrivent en même temps.

Notez que je ne m'attends pas à ce que le fichier subisse des modifications lors de l'exécution.

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

Je suppose que vous allez utiliser JSON.parse le fichier json pour la comparaison; dans ce cas, require est préférable car il analysera immédiatement le fichier et se synchronisera:

var obj = require('./myjson'); // no need to add the .json extension

Si vous avez des milliers de demandes utilisant ce fichier, demandez-le une fois en dehors de votre gestionnaire de demandes et le tour est joué:

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

Il existe deux versions pour fs.readFile, et elles sont

Version asynchrone

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

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

Version synchrone

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

Utiliser require pour analyser le fichier json comme ci-dessous

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

Mais, notez que

  • require est synchrone et ne lit le fichier qu'une fois. Les appels suivants renvoient le résultat à partir de cache

  • Si votre fichier ne possède pas l'extension .json, require ne traitera pas son contenu comme JSON.

47
zangw
{
  "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])
2
Ajay

Utilisez node-fixtures si vous utilisez des fixtures JSON dans vos tests. 

Le projet recherchera un répertoire nommé fixtures qui doit être enfant de votre répertoire de test pour charger tous les fixtures (fichiers * .js ou * .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" 
2
Stéphane Bruckert

Je veux seulement signaler qu'il semble que require garde le fichier en mémoire même lorsque les variables doivent être supprimées. J'ai eu le cas suivant: 

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

La première boucle avec require ne peut pas lire tous les fichiers JSON à cause de l'erreur "heap out of memory". La deuxième boucle avec readFile fonctionne. 

0
GoFindTruth