Search code examples
javascriptnode.jsfsnodejs-stream

Issue with loading chunks into the client


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()) })

Solution

  • 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 :)