Ошибка [ERR_HTTP_HEADERS_SENT]: не удается установить заголовки после их отправки клиенту 2

#express #middleware

#экспресс #промежуточное программное обеспечение

Вопрос:

Вот как сначала выглядел мой код:

 const express = require('express')
const app = express()
const morgan = require('morgan')

app.use(morgan('tiny'));
// app.use((req, res, next) => {
//     console.log("OUR MIDDLEWARE")
//     console.log(req.method.toUpperCase(), req.path);
//     next();
// })

app.use((req, res, next) => {
    console.log(req.query);
    const { pwd } = req.query

    if (pwd === 'chickennugget') {
        next();
    }
    res.send("Sorry, you need a password")
})

app.get('/', (req, res) => {
    res.send("HOME PAGE!!")
})

app.get('/dogs', (req, res) => {
    res.send("WOOF  WOOF!!")
})



app.listen(3000, () => {
    console.log("App is running on localhost:3000")
})
 

и это привело к этой ошибке :

 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (/Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/response.js:170:12)
    at /Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/app.js:19:9
    at Layer.handle [as handle_request] (/Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/router/index.js:317:13)
    at /Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/tebahsaboun/Desktop/STUDIES/UDEMY/TWDB 2021/Section 40: Express/Middleware_Intro/node_modules/express/lib/router/index.js:275:10)
 

и затем я инстинктивно исправил это, изменив этот конкретный фрагмент кода:

 app.use((req, res, next) => {
    console.log(req.query);
    const { pwd } = req.query

    if (pwd === 'chickennugget') {
        return next();
    }
    res.send("Sorry, you need a password")
})
 

(Я ввел возврат перед вызовом функции next() .)

Мой вопрос двоякий:

  • Почему я получаю эту ошибку с исходным кодом?
  • Зачем вводить ключевое слово «return». исправлена ошибка?

Я просмотрел StackOverflow для ответа, и существует существующая тема об этой ошибке, но я не вижу, как ответ применим к моей конкретной ситуации.

Большое вам спасибо за вашу помощь.

Лучшие,

Ответ №1:

В исходном коде ошибка заключается в том, что без return инструкции сервер пытается отправить два ответа. Первый был из промежуточного программного обеспечения:

 res.send("Sorry, you need a password")
 

И вторым был ответ от фактических маршрутов.

return Исправлена ошибка, потому что, когда переменная pwd равна «chickennugget», оператор return останавливает там код и никогда не считывает:

 res.send("Sorry, you need a password")
 

Вы можете прочитать о инструкции return здесь .

Комментарии:

1. Спасибо @monge1h