nodejs / nodejs/node

Stream.pipeline always throw [ERR_STREAM_PREMATURE_CLOSE]

Offen
#36,760 3 Kommentare 4 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

stream
Vorherrschende Sprache
JavaScript
Sterne
122k
Forks
37.3k
Ø Merge
4 T. 2 Std.
Gemergte PRs (30 T.)
283

Beschreibung

Hello.
Stream.pipeline throws error [ERR_STREAM_PREMATURE_CLOSE]: Closed prematurely, but the stream throw error new Error('destroy').

In a real application, a large file is uploaded, sometimes the server timed out the connection, and when using stream.pipeline it is not clear what error occurred, ERR_STREAM_PREMATURE_CLOSE is always returned.

Version: 15.5.0
Platform: Ubuntu 20.10 x64

/* eslint-disable */
import http from 'https';
import { createWriteStream } from 'fs';
import { pipeline } from 'stream/promises';

const httpRequest = url => new Promise(resolve => http.get(url, res => resolve(res)));

const FILENAME_TMP = './1.tmp'
const linkFile = 'https://nodejs.org/dist/v15.5.0/node-v15.5.0-linux-x64.tar.xz';

const downloadStream = await httpRequest(linkFile, { responseType: 'stream' });

// view error
downloadStream.on('error', err => console.log('onError', err));

// break download
setTimeout(() => downloadStream.destroy(new Error('destroy')), 1000);

try {
  await pipeline(
    downloadStream,
    createWriteStream(FILENAME_TMP)
  );

  console.log('Done');
} catch (err) {
  console.log('onPipeline', err);
}
onError Error: destroy
    at Timeout._onTimeout (file:///home/user/Project/parser/3.js:17:41)
    at listOnTimeout (node:internal/timers:556:17)
    at processTimers (node:internal/timers:499:7)
onPipeline Error [ERR_STREAM_PREMATURE_CLOSE]: Premature close
    at new NodeError (node:internal/errors:278:15)
    at IncomingMessage.onclose (node:internal/streams/end-of-stream:117:38)
    at IncomingMessage.emit (node:events:376:20)
    at IncomingMessage._destroy (node:_http_incoming:169:10)
    at _destroy (node:internal/streams/destroy:67:23)
    at IncomingMessage.destroy (node:internal/streams/destroy:59:5)
    at Timeout._onTimeout (file:///home/user/Project/parser/3.js:17:33)
    at listOnTimeout (node:internal/timers:556:17)
    at processTimers (node:internal/timers:499:7) {
  code: 'ERR_STREAM_PREMATURE_CLOSE'
}

Thank's

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Verwende die bereitgestellte Node.js 15.5.0-Reproduktion als Ausgangspunkt; untersuche stream/promises sowie die in der Stacktrace gezeigten end-of-stream- und destroy-Pfade. Vergleiche den destroy-Fehler des Quellstreams mit dem ERR_STREAM_PREMATURE_CLOSE-Ergebnis von pipeline und definiere done als Regressionstest oder dokumentiertes Verhalten, das die beabsichtigte Fehlerweitergabe eindeutig macht.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, nodejs
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.