错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.setHeader (_http_outgoing.js:518:11) 将标头发送到客户端后无法设置标头 [重

Posted

技术标签:

【中文标题】错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.setHeader (_http_outgoing.js:518:11) 将标头发送到客户端后无法设置标头 [重复]【英文标题】:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at ServerResponse.setHeader (_http_outgoing.js:518:11) [duplicate] 【发布时间】:2021-02-14 09:27:09 【问题描述】:

如果我从“/search”路由中删除 else 部分,代码可以正常工作,但我还必须处理与提供的对象不匹配的请求

块引用 我不断收到此错误 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:518:11) 在 ServerResponse.header (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:771:10) 在 ServerResponse.send (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:170:12) 在 ServerResponse.json (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:267:15) 在 C:\Users\A\Documents\Web development\yelp kamp\dummy\app.js:47:17 在 Array.forEach () 在 C:\Users\A\Documents\Web development\yelp kamp\dummy\app.js:39:12 在 Layer.handle [as handle_request] (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\layer.js:95:5) 在下一个(C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\route.js:137:13) 在 Route.dispatch (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\route.js:112:3)

节点服务器文件

app.use(express.json(type: ['application/json', 'text/plain']))
app.get("/",function(req,res)
    res.render('index');
)

var sender = [ 
    
        type: 'h',
        name:'soumya'
    ,
    
        type: 'i',
        name:'soumyaraj'
    ,
    
        type: 'j',
        name:'soumyaraj'
    ,
    
        type: 'k',
        name:'soumyaraj'
    

]

app.post("/search",function(req,res)

    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'POST');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested- 
    With,content-type');
    res.setHeader('Access-Control-Allow-Credentials', true);
    
    var s=[];
    sender.forEach(e=>
        if(e.type == req.body.search)
            console.log(req.body);
            s.push(e);
            res.json(s);
        
        else
            console.log(req.body);
            res.json([
                
                    type:"notfound"
                    ,name:"not found"
                
            ])
        
        
    )
    
)```




<body>

  <div id="myOverlay" class="overlay">
    <span class="closebtn" onclick="closeSearch()" title="Close Overlay">×</span>
    <div class="overlay-content">
      <form action="/search" method="GET" class="frm">
        <input id="inp" type="text" placeholder="Search.." name="search">

      </form>
      <div class="gap"></div>
      <div class="result">

      </div>
    </div>

  </div>

  <h2>Fullscreen Search</h2>
  <p>Click on the button to open the search box.</p>
  <button class="openBtn" onclick="openSearch()">Open Search Box</button>

  <script>
    var show = document.getElementsByClassName("result");

    function openSearch() 
      document.getElementById("myOverlay").style.display = "block";
    

    function closeSearch() 
      document.getElementById("myOverlay").style.display = "none";
    

    document.querySelector(".frm").addEventListener("submit", function(e) 
      e.preventDefault()

      go(e.target[0].value);
      return false;
    );

    document.getElementById("inp").addEventListener("input", function(e) 
      // if(e.target.value.length() === 0)


      //   show[0].textContent = "";
      // 
      go(e.target.value);

    );


    function go(search) 

      fetch("/search", 
        method: 'POST',
        mode: "cors",
        headers: 
          "Content-Type": "application/json"
        ,
        body: JSON.stringify(
          search: search,
          status: "find"
        )
      ).then(function(res) 
        return res.json();
      ).then(function(data) 


        show[0].style.display = "block";
        show[0].textContent = "";
        data.forEach(e => 
          show[0].innerhtml += e.type + "<br>";
          show[0].innerHTML += e.name + "<br>";
        );
      )

    
  </script>

</body>

【问题讨论】:

【参考方案1】:

是的,这是一个非常常见的问题。请做一些研究,this question 被询问并被查看超过一百万次。您只能向客户端响应一次(意思是使用res.send()res.render()res.json() 等)。但是您在.forEach() 循环中多次响应。你不能那样做。

【讨论】:

以上是关于错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.setHeader (_http_outgoing.js:518:11) 将标头发送到客户端后无法设置标头 [重的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法删除标头

Express.js 中的新 Mongoose Schema `ERR_HTTP_HEADERS_SENT` 错误

Firebase - Node.js - Express - 错误 [ERR_HTTP_HEADERS_SENT]

错误 [ERR_HTTP_HEADERS_SENT] 在将标头发送到客户端后无法设置标头

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头