Error: Can't set headers after they are sent

168
06 августа 2018, 15:40
app.post('/students/search', (req,res) => {
 fs.readFile('./db/students.json', 'utf8', (err, data) => {
    if (err) throw err;
    let studentsArr = JSON.parse(data);
    let reqName = req.query.name;
    console.log(reqName);
    let result;
    studentsArr.filter(el =>{
        let lowerCaseName =  el.name.toLowerCase();
        result = lowerCaseName.match(reqName);
        if(result){
            res.send(el);
        }
    });
 });

});

Столкнулся с одной проблемой, отправляю запрос на сервер, чтоб вывел мне все найденных студентов по имени, но выводит вот такую ошибку:

Error: Can't set headers after they are sent.

Answer 1

Ошибка кроется здесь:

studentsArr.filter(el =>{
    let lowerCaseName =  el.name.toLowerCase();
    result = lowerCaseName.match(reqName);
    if (result) {
        res.send(el);  // вот здесь
    }
});

Коллбэк, переданный в функцию filter, будет вызван для каждого элемента массива, а значит, если более одного объекта удовлетворят вашим условиям, то res.send будет вызван несколько раз (и вылетит ошибка, которая вылетела у вас, потому что отправить ответ можно только раз).

Попробуйте вынести res.send из скоупа функции filter:

let studentsAfterFilterList = studentsArr.filter(el =>{
    let lowerCaseName =  el.name.toLowerCase();
    return lowerCaseName.match(reqName);
});
res.send({ result: studentsAfterFilterList }

Тогда клиент, сделавший запрос, получит такой ответ:

{
    result: [
        // найденные объекты
    ]
}
READ ALSO
Цикл внутри метода append. JS

Цикл внутри метода append. JS

Есть цикл который выводит данные из массива в виде элементов на страницу с помощью метода appendНо так как массив многомерный мне понадобилось...

146
Загрузка изображений на сайте

Загрузка изображений на сайте

При использовании media-запросов в CSS будет ли загружаться background для десктопа, если разрешение соответствует мобильному устройству?

202