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