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
});
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
});
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
.
{
"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])
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"
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.