#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")
Комментарии:
1. Спасибо @monge1h