3

Setting up a new http server with Node.js

When you first launch it, it displays the proper html text on the screen but when you move to other links in my code ie: localhost:5001/about, it gives me an error in my IDE console

events.js:377
      throw er; // Unhandled 'error' event
      ^

Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at new NodeError (internal/errors.js:322:7)
    at writeAfterEnd (_http_outgoing.js:694:15)
    at ServerResponse.end (_http_outgoing.js:815:7)
    at Server.<anonymous> (/Users/angelo/Documents/coding/node/node-tutorial/app.js:11:7)
    at Server.emit (events.js:400:28)
    at parserOnIncoming (_http_server.js:900:12)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:127:17)
Emitted 'error' event on ServerResponse instance at:
    at writeAfterEndNT (_http_outgoing.js:753:7)
    at processTicksAndRejections (internal/process/task_queues.js:83:21) {
  code: 'ERR_STREAM_WRITE_AFTER_END'
}
[nodemon] app crashed - waiting for file changes before starting...

app.js

const http = require('http');

const PORT = 5001;
const server = http.createServer((req, res) => {
  if(req.url === '/'){
    res.end('Home Page')
  }
  if(req.url === '/about'){
    res.end('About Page')
  }
  res.end('Error page')
})

server.listen(PORT, () => {
  console.log(`Server is listening on port: ${PORT}`)
})

I've been looking for answer for the 'write after end' error but have not seen this specific issue for this specific block of code

1
  • Your code can run res.end twice, when it does it errors. Commented Oct 31, 2021 at 16:40

1 Answer 1

4

As mentioned on the comments, this is due to res.end being called multiple times, the simplest solution for you would either to return after each res.end or adjust your conditions:

const http = require('http');

const PORT = 5001;
const server = http.createServer((req, res) => {
  if(req.url === '/'){
    res.end('Home Page')
  }
  else if(req.url === '/about'){
    res.end('About Page')
  }
  else {
    res.end('Error page')
  }
})

server.listen(PORT, () => {
  console.log(`Server is listening on port: ${PORT}`)
})
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you. Returning each res.end solved my problem. How would you adjust the condition otherwise?
Hi, I posted a way to change the conditions based on else if and else instead of doing just if so it won't go into other cases once it gets into a specific case

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.