0

If I remove the else part from my "/search" route the code works perfectly fine but I also have to handle requests the don't match with the object provided

Blockquote I keep getting this error Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:518:11) at ServerResponse.header (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:771:10) at ServerResponse.send (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:170:12) at ServerResponse.json (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:267:15) at C:\Users\A\Documents\Web development\yelp kamp\dummy\app.js:47:17 at Array.forEach () at C:\Users\A\Documents\Web development\yelp kamp\dummy\app.js:39:12 at Layer.handle [as handle_request] (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\route.js:112:3)

node server file

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 Answers1

2

Yes that's a very common question. Please do some research, this question was asked and was viewed over a million times. You can only respond once to the client (meaning, use res.send() or res.render() or res.json() etc). But you respond multiple times, in a .forEach() loop. You can't do that.

Jeremy Thille
  • 26,047
  • 12
  • 43
  • 63