2016-02-14 2 views
21

Предположим, что для каждого ответа от API мне нужно сопоставить значение из ответа на существующий json-файл в моем веб-приложении и отобразить значение из json. Каков лучший подход в этом случае для чтения json-файла? require или fs.readfile. Обратите внимание, что одновременно могут появляться тысячи запросов.Прочтите содержимое файла json с требованием vs fs.readFile

Заметьте, что я не ожидаю, что во время выполнения произойдут какие-либо изменения в файле.

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

ответ

31

Я полагаю, вы JSON.parse файл JSon для сравнения, в этом случае, require лучше, потому что он будет анализировать файл сразу, и это синхронизация:

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

Если у вас есть тысячи запроса, используя этот файл, требуется его раз за пределами вашего обработчика запроса и вот оно:

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

Не является ли «требованием» синхронным? В зависимости от размера файла JSON или варианта использования fs.readFile должен быть лучше. –

+0

Я тоже согласен и даже предлагаю, используя трубопровод для больших файлов. Для больших подключений также значительно повышается гомеостационарное (пространственное/временное индексирование) соединений. –

37

есть две версии fs.readFile, и они

Асинхронный версия

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

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

Синхронная версия

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

Чтобы использовать require для разбора JSON-файл, как показано ниже

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

Но, обратите внимание, что

  • require синхронно и только читает файл один раз, после вызовов возвращают результат из кэша

  • Если файл не имеет .json расширения, требует не будет рассматривать содержимое файла, как JSON.

+3

Мне было интересно, почему мой запрос ('file.json') менялся до тех пор, пока я не прочитал этот - «require является синхронным и только один раз читает файл, после чего вызовы возвращают результат из кеша». Это можно обойти - delete require.cache [require.resolve ('file.json')] –

1

Использование node-fixtures при работе с приборами JSON в ваших тестах.

Проект будет искать папку с именем светильников, которые должны быть ребенок тестовой директории для того, чтобы загрузить все светильники (* .js или * .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"