заголовки js сервера узла - PullRequest
0 голосов
/ 03 февраля 2019

Я сейчас начинающий в веб-разработке.Поэтому, естественно, я использую node.js в качестве серверной части для создаваемого мной приложения, которое включает получение данных с использованием REST, а затем поиск и сортировку.Часть, на которой я застрял, заключается в том, как работают заголовки node.js и вообще на веб-сервере.Приведенный ниже код в основном настраивает сервер на порт 3000, а затем у меня есть счетчик, который подсчитывает, сколько раз была достигнута конечная точка.Что я не получаю, так это ошибку, которую выбрасывает узел.Поэтому я попытался переписать заголовки.Из исследований, которые я провел в Интернете, следует, что, как только сервер, который в данном случае является node.js, выполняет рукопожатие с клиентом, который является нашим клиентом, он устанавливает заголовок.Затем клиент может сделать запрос к серверу с использованием API-маршрутов и получить ответ.Что я не понимаю, так это как заголовки используются в этом?

const express = require('express');
const app = express();
const port = 3000;

var counter=0;

app.get('/',(req,res) => {
    res.send("Hello World");
    console.log("First Request");
    counter++;

    if(counter%2)
    {
           res.setHeader("Content-Type", "text/html");
           res.send("Second Request");
    }


})


app.listen(port,()=>{
    console.log("App is listening on port 3000");
})

Исключение, которое он выдает, это

rror [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at app.get (/Users/taherhuzefa/Desktop/Personal/groupme_extension/index.js:14:16)
    at Layer.handle [as handle_request] (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/r
outer/layer.js:95:5)
    at next (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/router/route.js:112
:3)
    at Layer.handle [as handle_request] (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/r
outer/layer.js:95:5)
    at /Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/router/ind
ex.js:335:12)
    at next (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/router/index.js:275:10)
    at expressInit (/Users/taherhuzefa/Desktop/Personal/groupme_extension/node_modules/express/lib/middleware/init.js:40:
5)

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

То, что вы делаете, это то, что вы пытаетесь отправить ответ после того, как он уже был отправлен в некоторых случаях.Чтобы очистить это,

Случай 1: когда ваше условие if ложно.

В этом случае res.send ('Hello World');был бы уже выполнен, и условие If res.send («второй запрос») не будет выполнено.Таким образом, вы не получите ошибку.

Случай 2: когда ваше условие if истинно.

В этом случае res.send ("Hello World");будет выполняться первым, это означает, что ответ уже был отправлен, теперь условие «Если» будет истинным, и программа снова отправит ответ, что является недопустимой операцией в экспрессе, поскольку ответ уже был отправлен.

Чтобы решить эту проблему, измените свой код на это:

const express = require('express');
const app = express();
const port = 3000;

var counter=0;

app.get('/',(req,res) => {

 if(counter%2)
{
       res.setHeader("Content-Type", "text/html");
       res.send("Second Request");
}

else{
res.send("Hello World");
console.log("First Request");

}
counter++;
})


app.listen(port,()=>{
console.log("App is listening on port 3000");
})
0 голосов
/ 03 февраля 2019

Используйте res.write() для отправки нескольких экземпляров данных.res.send() завершает соединения после первой отправки данных.С помощью res.write() вы можете отправлять данные несколько раз, а затем закрывать соединение с помощью res.end().res.send() после отправки данных первый раз автоматически закрывает соединение.res.send() будет работать в первый раз, поскольку внутренне он вызывает res.write(), за которым следует res.end(), и многократный вызов res.send() по этой причине не будет работать.

var counter=0;
app.get('/',(req,res) => {
console.log("First Request");
    counter++;
  res.write("Hello World");
    if(counter%2)
    {
           res.setHeader("Content-Type", "text/html");
           res.write("Second Request");
    }


res.end();

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