Вы никогда не должны использовать fs.readFileSync
в производстве.Любая функция синхронизации будет блокировать цикл обработки событий до тех пор, пока выполнение не будет завершено, что отсрочит все последующие слова (используйте с осторожностью, если сочтете необходимым) .Несколько дней назад я сам испытал наихудший опыт и усвоил это трудно.
В экспрессе вы можете определить маршрут с помощью param
или query
и использовать его для map
содержимого внутри fs.readFile
функция обратного вызова.
/**
* get color by name
*
* @param {String} name name of the color
* @return {Array} array of the color data matching param
*/
router.get('/colors/:name', (req, res) => {
const color = req.params.name
const filename = __dirname + '/data.json';
fs.readFile('/etc/passwd', 'utf8', (err, data) => {
if(err){
return res.send([]); // handle any error returned by readFile function here
}
try{
data = JSON.parse(data); // parse the JSON string to array
let filtered = []; // initialise empty array
if(data.length > 0){ // we got an ARRAY of objects, right? make your check here for the array or else any map, filter, reduce, forEach function will break the app
filtered = data.filter((obj) => {
return obj.color === color; // return the object if the condition is true
});
}
return res.send(filtered); // send the response
}
catch(e){
return res.send([]); // handle any error returned from JSON.parse function here
}
});
});
Для подведения итогов используйте асинхронную функцию fs.readFile
, чтобы цикл событий не был засорен.Внутри обратного вызова проанализируйте содержимое, а затем return
ответ.return
действительно важно, иначе вы можете получить Ошибка: невозможно установить заголовки после их отправки
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Данный код не протестирован, но долженРабота.Это просто для демонстрации идеи.