2

I'm trying to create a readableStream through which I would send chunks of data ( html in this case ). The problem is that even if I manage to get a chunk of data the res.write() method does nothing and just returns false if I log it. I wonder why is that?

import { createServer } from 'http'
import { createReadStream } from 'fs'

const server = createServer((req, res) => {
    if (req.method === 'GET') {
        if (req.url === '/') {
            res.writeHead(200, { 'Content-Type': 'text/html' })

            let readStream = createReadStream('./src/public/index.html', { encoding: 'utf8' })

            readStream.on('data', (chunk) => {
                console.log(chunk)
                // html code
                res.write(chunk)
                // does nothing
            })
            res.end()
        }
    }
})

const PORT = 3000 || 8080

server.listen(PORT, () => { console.log(server.address()) })
anathrax
  • 91
  • 1
  • 1
  • 11
  • You call `res.end()` before you do any `res.write`. – t.niese Aug 19 '22 at 17:20
  • It turns out you're right. And even though @alguerocode's solution helped me to solve this problem I would like to do it similarly as in my example. Is there any simple way to prevent the `res.end()` method from executing first? – anathrax Aug 19 '22 at 17:37

1 Answers1

0

you should add a pipe function not a regular write to the response

  readStream.on('open', function () {
    // This just pipes the read stream to the response object (which goes to the client)
    readStream.pipe(res);
  });

  // This catches any errors that happen while creating the readable stream (usually invalid names)
  readStream.on('error', function(err) {
    res.status(500).end(err);
  });

for more information: https://nodejs.org/en/knowledge/advanced/streams/how-to-use-fs-create-read-stream/

I hope it help you :)

alguerocode
  • 112
  • 4