Почему я получаю сообщение об ошибке «Невозможно установить заголовки после их отправки клиенту», хотя я использовал return после 1 ответа - PullRequest
0 голосов
/ 04 февраля 2020

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

events.js:298
      throw er; // Unhandled 'error' event
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:535:11)
    at ServerResponse.header (C:\Web Develope\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\Web Develope\node_modules\express\lib\response.js:170:12)
    at C:\Web\wiki-API\app.js:69:21
    at C:\Web\node_modules\mongoose\lib\model.js:4798:16
    at C:\Web\node_modules\mongoose\lib\query.js:4389:12
    at C:\Web\node_modules\mongoose\lib\helpers\query\completeMany.js:35:39
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
Emitted 'error' event on Function instance at:
    at C:\Web\node_modules\mongoose\lib\model.js:4800:13
    at C:\Web\node_modules\mongoose\lib\query.js:4389:12
    at C:\Web\node_modules\mongoose\lib\helpers\query\completeMany.js:35:39
    at processTicksAndRejections (internal/process/task_queues.js:79:11) {
  code: 'ERR_HTTP_HEADERS_SENT'
}

Вот мой код:

app.route('/data/:dataName')
    .get((req,res)=>{
        Article.find({},(err,list_data)=>{
            if(!err){
                if(list_data){
                    list_data.forEach((item)=>{
                        if(_.lowerCase(req.params.dataName) === _.lowerCase(item.title)){
                            return res.send(item);
                        }
                    });
                }
                res.send("No data found!");
            }
        })
    })

Я до сих пор не могу понять, почему после выполнения 1-го ответа он все еще go к следующему и выдает ошибку!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Ошибка, которую вы получили из-за того, что ответ был отправлен несколько раз. Для обработки обратного вызова следует использовать подход, основанный на ошибках, как показано ниже.

app.route('/data/:dataName')
.get((req,res)=>{
    Article.find({}, async (err,list_data)=>{
        if(err){
            return res.send("No data found!");
        }
        if(list_data){
           let filter_data = await list_data.filter((item)=>{
               return req.params.dataName === _.lowerCase(item.title)
           });
         return res.send(filter_data)
        }
    })
})
0 голосов
/ 04 февраля 2020

В Node Js вы можете отправить только один ответ на один запрос. Вы не можете отправить два ответа, если пользователь найден или нет.

if(_.lowerCase(req.params.dataName) === _.lowerCase(item.title)){
                            return res.send(item);
                        }
else 
res.send("No data found!");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...