Per aumentare la performance della nostra applicazione in ExpressJS quando dobbiamo implementare il download dei file, possiamo far ricorso agli stream di Node.js.

Il modulo core fs di Node.js ci consente di creare uno stream in lettura utilizzando il metodo createReadStream(). Lo stream così creato a partire da un percorso nel file system può essere reindirizzato allo stream di output dell'oggetto response gestito da ExpressJS.

Dobbiamo semplicemente aggiungere gli header HTTP corretti per servire il file e consentirne il download.

'use strict';

const fs = require('fs');
const FILES_PATH = '../files';
const express = require('express');
const File = require('../models/file');
const router = express.Router();


router.get('/download/:id', async (req, res, next) => {
    const { id } = req.params;
    try {
        const file = await File.findById(id);
        if(!file) {
            return res.sendStatus(404);
        }
        
        const filePath = FILES_PATH . '/' . file.path;
        const data = fs.createWriteStream(filePath);
        const disposition = 'attachment; filename="' + file.name + '"';
        
        res.setHeader('Content-Type', file.mime);
        res.setHeader('Content-Disposition', disposition);
        
        data.pipe(res);
    } catch(err) {
        res.sendStatus(500);
    }
});

module.exports = router;

In questo esempio le informazioni ed i metadati dei file vengono salvati nel database e reperiti dinamicamente nella route che permette il download di un file specifico.

Si tratta di una soluzione che permette di avere un notevole aumento della performance soprattutto con file di grandi dimensioni.