ortense
1/24/2018 - 9:24 PM

README.md

const fs = require('fs')
const http = require('http')
const path = require('path')
const mime = require('mime-types')

const errorHandler = (error, response) => {
  response.statusCode = 500
  response.setHeader('Content-Type', 'text/html')
  response.end(`<h1>${error.message}</h1>`)
}

const render = (file, status = 200) => (request, response) => {
  const filePath = path.resolve(__dirname, `../static/${file}`)
  response.statusCode = status
  response.setHeader('Content-Type', 'text/html')
  fs.readFile(filePath, 'utf8', (error, content) => {
    if (error) return errorHandler(error, response)
    return response.end(content)
  })
}

const stream = file => (request, response) => {
  const filePath = path.resolve(__dirname, `../static/${file}`)
  const readStream = fs.createReadStream(filePath)
  response.statusCode = 200
  response.setHeader('Content-Type', mime.lookup(file))
  readStream.on('error', error => errorHandler(error, response))
  readStream.pipe(response)
}

const routes = {
  '/': render('index.html'),
  '/not-found': render('not-found.html', 404),
  '/big-file.xlsx': stream('very-big-file.xlsx')
}

const server = http.createServer((request, response) =>
  (routes[request.url] || routes['/not-found'])(request, response))

server.listen(3000, () => console.log('Server up at http://localhost:3000'))
{
  "name": "big-file-download",
  "version": "1.0.0",
  "scripts": {
    "start": "node src/server.js"
  },
  "author": "Marcus Ortense",
  "dependencies": {
    "mime-types": "^2.1.17"
  }
}

Node stream big file

../big-file-download
├── package.json
├── src
│   └── server.js
└── static
    ├── index.html
    ├── not-found.html
    └── very-big-file.xlsx <- 100mb