2016-02-14 11 views
21

Angenommen, dass ich 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 muss. Was ist in diesem Fall der bessere Ansatz, die JSON-Datei zu lesen? require oder fs.readfile. Beachten Sie, dass möglicherweise mehrere Tausend Anfragen gleichzeitig eingehen.JSON-Dateiinhalt mit require vs fs.readFile lesen

Beachten Sie, dass ich keine Änderungen an der Datei während der Laufzeit erwarte.

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

Antwort

31

Ich nehme an, Sie werden die JSON-Datei für den Vergleich JSON.parse, in diesem Fall require ist besser, weil es die Datei sofort analysieren werden und es ist sync:

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

Wenn Sie haben tausende von Anforderung, die Datei verwenden, benötigen sie einmal außerhalb des Request-Handler und das ist es:

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

Ist 'synchronous' nicht erforderlich? Abhängig von der Größe der JSON-Datei oder des Anwendungsfalls sollte fs.readFile besser sein. –

+0

Auch ich stimme zu und schlage sogar vor, Piping für größere Dateien zu verwenden. Für große Verbindungen erweist sich auch das Pigeon-Holing (räumliche/zeitliche Indexierung) von Verbindungen als sehr effizient. –

37

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

Asynchronous Version

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

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

Synchronversion

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

require zu verwenden JSON-Datei zu analysieren, wie unten

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

Aber beachten Sie, dass

  • require ist synchron und liest nur die einmal Datei, folgende Anrufe das Ergebnis aus Cache

  • zurückkehren Wenn die Datei eine .json Erweiterung nicht hat, erfordert nicht den Inhalt der Datei behandeln, als JSON.

+3

Ich fragte mich, warum meine require ('file.json') geändert hat, bis ich diese lesen - "require ist synchron und liest nur die Datei einmal, folgende Aufrufe geben das Ergebnis aus dem Cache zurück". Dies kann umgangen werden - delete require.cache [require.resolve ('file.json')] –

1

Verwenden Sie node-fixtures, wenn Sie mit JSON-Fixtures in Ihren Tests zu tun haben.

Das Projekt für ein Verzeichnis mit dem Namen Armaturen aussehen wird, das Kind Ihres Testverzeichnis, um alle Vorrichtungen sein müssen, laden (* Js oder * .json Dateien):

// 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" 
Verwandte Themen