next () не работает на Express 4, ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 01 марта 2020

Я изучаю ExpressJS, но next () не работает. пожалуйста, помогите.

Я смотрю курс Удеми о Express JS. И я кодировал как код инструктора, но я получаю такую ​​ошибку.

expressJS версия: 4.17.1

index. js:

const express = require("express");
const app = express();
const port = 1014;

app.use("/", (req, res, next) => {
     res.send("<h1>Home page</h1>");
     console.log("/ Ok");
     next();
});

app.use("/about", (req, res, next) => {
    res.send("<h1>About page</h1>");
    console.log("/about ok");
});


app.listen(port, () => console.log("Sunucu Aktif!: http://localhost:" + port + "/"));

Я получаю эту ошибку при входе на страницу / о.

[nodemon] restarting due to changes...
[nodemon] restarting due to changes...
[nodemon] starting `node index.js`
Sunucu Aktif!: http://localhost:1014/
/ Ok
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:526:11)
    at ServerResponse.header (C:\projects\expresslesson\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\projects\expresslesson\node_modules\express\lib\response.js:170:12)
    at C:\projects\expresslesson\index.js:12:9
    at Layer.handle [as handle_request] (C:\projects\expresslesson\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\projects\expresslesson\node_modules\express\lib\router\index.js:317:13)
    at C:\projects\expresslesson\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (C:\projects\expresslesson\node_modules\express\lib\router\index.js:335:12)
    at next (C:\projects\expresslesson\node_modules\express\lib\router\index.js:275:10)
    at C:\projects\expresslesson\index.js:8:6
/ Ok

Как вы думаете, проблема и решение в коде, я жду вашего ответа.

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Ошибка Cannot set headers after they are sent to the client заключается в том, что вы звоните next() сразу после вызова res.send() в обработчике маршрута /. Вы заканчиваете запрос на res.send(), поэтому вам не следует звонить next() сразу после. Используйте next только в том случае, если вы пытаетесь передать управление следующей функции промежуточного программного обеспечения.

app.use('/', (req, res, next) => {
  console.log('I will pass control to the next middleware/handler.')
  next()
})

app.get('/', (req, res, next) => {
  res.send("<h1>Home</h1>")
})

Также используйте app.use для монтирования определенных c функций промежуточного программного обеспечения по указанным путям, как в пример выше.

Вместо этого вам нужно использовать app.get для правильной обработки маршрутов.

const express = require("express");
const app = express();
const port = 1014;

app.use("/", (req, res, next) => {
  // will only get triggered if you access `home`
  console.log(`HelloWorld`);
  next();
});

app.get("/", (req, res, next) => {
  res.send("<h1>Home</h1>");
});

app.get("/about", (req, res, next) => {
  res.send("<h1>About page</h1>");
});

app.listen(port, () => console.log(`Listening on port ${port}`));

Теперь вы должны иметь доступ к http://localhost:1014/ и http://localhost:1014/about без вопросы.

0 голосов
/ 01 марта 2020

TLDR

Как указано @ goto , после вызова res.send() не должно сразу следовать next().

Больше

См. res.send как сервер, выводящий обратно запрашивающей стороне. После вызова next вы говорите Express направить запрос следующему промежуточному программному обеспечению, которое технически является промежуточным программным обеспечением ошибки.

В Express при поступлении запроса он ищет промежуточное программное обеспечение, которое совпадает с URL и методом. Если ничего не найдено, оно пересылается следующему промежуточному программному обеспечению. Последним из них является промежуточное ПО ошибки, и ошибка выдается пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...