节点js服务器标头

时间:2019-02-03 06:44:15

标签: javascript node.js express web

我目前是网络开发的初学者。因此,很自然地,我将node.js用作我正在创建的应用程序的后端,该应用程序涉及使用REST获取数据,然后进行搜索和排序。我坚持的部分是标题如何工作node.js以及通常在Web服务器上。我下面的代码基本上是在端口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 :(得分:1)

您正在做的是,在某些情况下,您正在尝试发送响应。要清除它,

情况1:如果您的if条件为假。

在这种情况下,res.send('Hello World');将已经运行,并且if条件res.send(“ second request”)将不会运行。因此,您不会收到错误。

情况2:如果您的if条件为true。

在这种情况下,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");
})

答案 1 :(得分:0)

使用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();

})