2016-02-14 9 views
21

Supponiamo che per ogni risposta da un'API, ho bisogno di mappare il valore dalla risposta a un file json esistente nella mia applicazione web e visualizzare il valore di JSON. Qual è l'approccio migliore in questo caso per leggere il file JSON? richiede o fs.readfile. Tieni presente che potrebbero esserci migliaia di richieste contemporaneamente.Leggere il contenuto del file json con require vs fs.readFile

Nota che non mi aspetto modifiche al file durante il runtime.

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

risposta

31

suppongo si JSON.parse il file JSON per il confronto, in questo caso, require è meglio perché sarà analizzare il file subito ed è la sincronizzazione:

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

Se si hanno migliaia di richiesta utilizzando quel file, richiedono una volta al di fuori vostro gestore di richiesta e il gioco è fatto:

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

Non è 'require' sincrono? A seconda delle dimensioni del file JSON o del caso d'uso, fs.readFile dovrebbe essere migliore. –

+0

Anch'io sono d'accordo e suggerisco anche, usando piping per file più grandi. Allo scopo di connessioni di grandi dimensioni, il serramento dei piccioni (indicizzazione spaziale/temporale) delle connessioni dimostra anche di aggiungere grande efficienza. –

37

ci sono due versioni per fs.readFile, e sono

Asynchronous versione

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

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

sincrono versione

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

Per utilizzare require analizzare il file JSON, come di seguito

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

Ma, si noti che

  • require è sincrona e legge solo il file una volta, a seguito di inviti restituire il risultato da cache di

  • Se il file non ha un'estensione .json, necessita di non trattare il contenuto del file come JSON.

+3

Mi chiedevo perché il mio require ('file.json') continuasse a cambiare finché non ho letto questo - "require is synchronous e legge il file una volta sola, dopo le chiamate restituisce il risultato dalla cache". Questo può essere bypassato da: delete require.cache [require.resolve ('file.json')] –

1

Utilizzare node-fixtures se si tratta di dispositivi JSON nei test.

Il progetto cercherà una directory chiamata infissi che devono essere figlio della vostra directory di prova al fine di caricare tutti gli infissi (* .js o file * .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"