2016-02-14 13 views
21

Załóżmy, że dla każdej odpowiedzi z interfejsu API, muszę odwzorować wartość z odpowiedzi na istniejący plik json w mojej aplikacji internetowej i wyświetlić wartość z json. Jakie jest lepsze podejście w tym przypadku, aby przeczytać plik json? require lub fs.readfile. Pamiętaj, że mogą pojawić się tysiące żądań w tym samym czasie.Odczytaj zawartość pliku json z wymaganiem vs fs.readFile

Należy zauważyć, że nie oczekuję żadnych zmian w pliku podczas uruchamiania.

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

Odpowiedz

31

Przypuszczam będziesz JSON.parse plik json dla porównania, w tym przypadku, require jest lepszy, ponieważ będzie ona analizować plik od razu i to sync:

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

Jeśli masz tysiące zamówienie za pomocą tego pliku, wymaga to raz poza obsługi żądań i to jest to:

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

Czy nie jest "wymagane" synchroniczne? W zależności od rozmiaru pliku JSON lub przypadku użycia, fs.readFile powinno być lepsze. –

+0

Ja też się zgadzam, a nawet sugeruję, używając potoków do większych plików. W przypadku dużych połączeń połączenia gołębi (indeksowanie przestrzenne/czasowe) również zwiększają wydajność. –

37

Istnieją dwie wersje dla fs.readFile i są

asynchroniczna wersja

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

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

synchroniczna wersja

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

Aby korzystać require do analizowania pliku json jak poniżej

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

Ale należy pamiętać, że

  • require jest synchroniczna i tylko czyta plik raz, w następstwie połączenia zwraca wynik z cache

  • Jeśli plik nie posiada .json rozszerzenie, wymagają nie będzie traktować zawartość pliku jako JSON.

+3

Zastanawiam się, dlaczego moje żądanie ("file.json") ciągle się zmieniało, dopóki nie przeczytam tego - "require is synchronous and only reads file once, po wywołaniach zwraca wynik z cache". To może być ominięte przez - delete require.cache [require.resolve ('file.json')] –

1

Użyj node-fixtures jeśli masz do czynienia z urządzeniami JSON w twoich testach.

Projekt będzie szukać katalogu o nazwie lamp, które muszą być dziecko katalogu testowego w celu załadowania wszystkich urządzeń (* lub * .js pliki .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"