Estaba procesando algunos archivos en la tubería de transmisión y quería probar algunas condiciones de error. Lo primero que me vino a la mente fue abrir un archivo no existente. Y descubrí que no puedo manejar esta situación. Parece que node.fs no emite un evento de 'error'. ¿Alguien sabe cómo manejar el caso? He leído que existe la misma situación con fs.unlink.
const fName = 'C:/temp/fff.txt'; const outStream = fs.createWriteStream(fName + '.enc'); console.log(`-- 1111 ${fName} `); fs.createReadStream(fName) .pipe(outStream) .on('open', () => { console.log(`ON OPEN ${fName}`); }) .on('error', (err) => { console.log(`ON ERROR ${fName}; an error happened: ${err.message}`); }) .on('close', () => { console.log(`ON CLOSE ${fName}`); }) .on('end', () => { console.log(`ON END ${fName}`); }); console.log(`-- 2222 ${fName} `);Si el archivo existe, la salida:
-- 1111 C:/temp/fff.txt -- 2222 C:/temp/fff.txt ... ON OPEN C:/temp/fff.txt ON CLOSE C:/temp/fff.txtSi el archivo no existe:
-- 1111 C:/temp/fff.txt -- 2222 C:/temp/fff.txt ... ON OPEN C:/temp/fff.txt 2022-06-13T19:28:48.379Z; error; uncaughtException: ENOENT: no such file or directory, open 'C:\temp\ffff.txt' Error: ENOENT: no such file or directory, open 'C:\temp\ffff.txt'; C:\Users\p>Problema similar: aquí
La gente pregunta: ¿Existe la posibilidad de que se emita el evento de error antes de que stream.on('error', ...) surta efecto?
Muchas gracias
Parece que stream.pipe no reenvía los eventos de 'error', por lo que si desea manejar los errores, deberá hacer algo como a continuación, o usar stream.pipeline
rstream .on('error', handleError) .pipe(foo) .on('error', handleError) .pipe(bar) .on('error', handleError);Gracias a esta discusión