Es sieht so aus, als ob die Datei nicht geschlossen wird oder zumindest Ihr end
Event-Handler nicht aufgerufen wird.
Sie können Test dafür schaffen, aber hier ist meins:
const http = require('http');
const fs = require('fs');
var server = http.createServer(function (req, res) {
console.log('server request received');
const fd = fs.openSync('myfile.txt', 'r');
fs.createReadStream(null, { fd, autoClose: false })
.on('error', err => {
console.error('file error', err);
})
.on('end',() => {
console.log('file end');
fs.close(fd);
})
.on('close',() => {
console.log('file closed');
})
.pipe(res)
.on('error', err => console.error('server stream error', err))
.on('end',() => console.log('server stream end'))
.on('close',() => console.log('server stream closed'))
;
});
server.listen(0, 'localhost',() => {
const address = server.address();
var req = http.request({port: address.port}, function (res) {
res.on('data', data => {
console.log('response data');
// Comment next line to read whole file.
req.abort();
});
res.on('end',() => {
console.log('response ended');
setTimeout(() => server.close(), 1000);
});
req.once('abort',() => {
console.log('request aborted');
});
});
req.end(() => {
console.log('request sent');
});
});
Ich entfernte async/warten zur Vereinfachung der Test läuft.
Wenn req.abort()
genannt wird, i folgende Ausgabe:
request sent
server request received
response data
request aborted
response ended
server stream closed
nach dieser Zeile zu kommentieren, und damit Code gesamte Datei zu lesen:
request sent
server request received
response data
response data
response data
response data
response data
response data
file end
response data
response ended
erstellen Test myfile.txt
i folgender Befehl verwendet:
dd if=/dev/zero of=myfile.txt bs=1k count=200
Das ist eigentlich nicht überraschend - ein Set 'autoClose: fa lse' explizit und hat die Datei nicht "geschlossen". – zerkms
Ja, aber ich nehme an, dass 'autoClose' nicht ohne Grund auf' false' gesetzt wurde - genau wie asing 'fs.open' zuerst, anstatt den Dateipfad zu' fs.createReadStream' zu übergeben, wie in Frage erklärt: "Hinweis Ich weiß, ich könnte das ohne fd machen, aber das ist eine Vereinfachung von komplexem Code. " – ahwayakchih
Ja, das verstehe ich auch. Aber in diesem Fall führte die zu starke Vereinfachung zu den naiv erwarteten Ergebnissen, die keine Bestätigung brauchten :-) Wie auch immer, ich beziehe mich nicht auf deine Antwort, es ist gut und ich habe es aufgewertet :-) – zerkms