node.js - Hur skapar man en filström och skriver till strömmen asynkront?
Jag är ny på TypeScript/JavaScript och Node.
Nu försöker jag skapa en filström och skriva "Hello!" till strömmen asynkront.
#!/usr/bin/env node
import fs from 'fs';
function createStream(filePath: string): Promise<fs.WriteStream> {
return new Promise<fs.WriteStream>((resolve, reject) => {
const out = fs.createWriteStream(filePath);
out.on('close', () => {
console.log(filePath + ' closed');
resolve(out);
});
out.on('error', (err: any) => {
console.log(filePath + ' ' + err);
reject(err);
});
});
}
createStream('/tmp/test.txt').then((out:fs.WriteStream) => {
console.log(out);
out.write('Hello!');
out.end();
})
Denna kod skapar /tmp/test.txt men skriver ut ingenting och filen är tom.
Vad är problemet med denna kod?
Svar #1
Du behöver inte lösa ett löfte med fs.WriteStream eftersom dess skapande är synkront. Anropa bara fs.createWriteStream() direkt och skicka instansen till din funktion för att skapa ett löfte som löses när strömmen stängs eller får ett fel:
#!/usr/bin/env node
import fs from 'fs';
import stream from 'stream';
function promisify(s: stream.Stream): Promise<void> {
return new Promise<void>((resolve, reject) => {
const onClose = () => {
s.off('error', onError);
resolve();
};
const onError = (error: Error) => {
s.off('close', onClose);
reject(error);
};
s.once('close', onClose);
s.once('error', onError);
});
}
const out = fs.createWriteStream('/tmp/test.txt');
promisify(out).then(() => {
console.log('Done');
});
out.write('Hello!');
out.end();
