2016-07-03 7 views
0

Betrachten Sie die folgende eher trivial Middleware:Proper Sende Datei mit NodeJS

(req, res, next) => { 
    const stream = fs.createReadStream(req.filePath) 

    await new Promise((resolve, reject) => stream  
    .on('error', reject) 
    .on('end', resolve) 
    .pipe(res, { end: false }) 
    .on('error', reject) 
    // 'close' is emitted if client prematurely disconnects. 
    .on('close', resolve) 
    res.end() 
} 

Es gibt ein paar Probleme, die ich nicht sicher bin, wie zu handhaben:

  • Wenn res bereits emittiert ‚close‘ vor Diese Middleware läuft es wird stecken bleiben.
  • Wenn res close oder error ausstrahlt, wie wird der Quelldatenstrom bereinigt? autoClose wird nur unter end ausgeführt, das nur ausgeführt wird, wenn alle Daten gelesen wurden. Wenn das Ziel jedoch fehlschlägt, wie wird es an die Quelle weitergegeben? Sollte ich immer destroy auf dem Quell-Stream aufrufen?

Antwort

0

Dies scheint den Trick zu tun:

import onFinished from 'on-finished' 

(req, res, next) => { 
    const stream = fs.createReadStream(req.filePath) 

    onFinished(res,() => stream.destroy && stream.destroy()) 

    if (onFinished.isFinished(res)) { 
    return 
    } 

    await new Promise((resolve, reject) => stream  
    .on('error', reject) 
    .on('end', resolve) 
    .pipe(res, { end: false }) 
    .on('error', reject) 
    // 'close' is emitted if client prematurely disconnects. 
    .on('close', resolve) 
    res.end() 
}