web-dev-qa-db-de.com

Lesen Sie den Inhalt der Json-Datei mit "request vs fs.readFile"

Angenommen, ich muss für jede Antwort von einer API den Wert aus der Antwort einer vorhandenen Json-Datei in meiner Webanwendung zuordnen und den Wert aus dem Json anzeigen. Was ist der bessere Ansatz, um die Json-Datei zu lesen? erfordern oder fs.readfile. Beachten Sie, dass möglicherweise Tausende Anfragen gleichzeitig eingehen.

Beachten Sie, dass ich nicht erwarte, dass sich zur Laufzeit Änderungen an der Datei ergeben.

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

Ich nehme an, dass Sie JSON.parse die Json-Datei für den Vergleich. In diesem Fall ist require besser, da die Datei sofort analysiert und synchronisiert wird:

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

Wenn Sie Tausende von Anforderungen haben, die diese Datei verwenden, fordern Sie sie einmal außerhalb Ihres Anforderungshandlers an.

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

Es gibt zwei Versionen für fs.readFile, und das sind sie

Asynchrone Version

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

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

Synchrone Version

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

Verwenden Sie require, um die Json-Datei wie folgt zu analysieren

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

Aber beachte das

  • require ist synchron und liest die Datei nur einmal. Nachfolgende Aufrufe geben das Ergebnis von cache zurück.

  • Wenn Ihre Datei keine .json-Erweiterung hat, wird der Inhalt der Datei nicht als JSON behandelt.

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

Verwenden Sie node-fixtures , wenn Sie JSON-Fixtures in Ihren Tests verwenden. 

Das Projekt sucht nach einem Verzeichnis mit dem Namen Fixtures, das dem Testverzeichnis untergeordnet sein muss, um alle Fixtures (* .js- oder * .json-Dateien) zu laden:

// 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

Ich möchte nur darauf hinweisen, dass es scheint, dass require die Datei im Speicher hält, selbst wenn die Variablen gelöscht werden sollen. Ich hatte folgenden Fall: 

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

Die erste Schleife mit require kann nicht alle JSON-Dateien aufgrund des Fehlers "Heap out of memory" lesen. Die zweite Schleife mit readFile funktioniert. 

0
GoFindTruth

Wenn Ihre Datei leer ist, bricht require ab. Es wird ein Fehler ausgelöst:

SyntaxError ... Unerwartetes Ende der JSON-Eingabe.

Mit readFileSync/readFile damit kannst du umgehen:

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

oder:

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