es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Escucha (propiedad) de process.stdout (en Node.js)

Probablemente una pregunta básica para aquellos familiarizados con el tema. Considera el siguiente programa de ejemplo:

  const fs = require('fs');
  process.stdout.on('data', (chunk) => {
    fs.writeFileSync('myfile.txt', chunk, 'utf-8'); // solo un ejemplo
  });
  process.stdout.write('xyz');

Si ejecuto este código tal como está, obtengo el siguiente error:

  errno: -4053,
  code: 'ENOTCONN',
  syscall: 'read'

Ya no entiendo por qué sucede eso. Pero se vuelve aún más extraño:

Cuando ejecuto el código con un console.log() antes de él, ¡ya no se lanza ningún error! Sin embargo, parece que el listener que definí para el evento data no se ejecuta en ese caso, ya que no se crea ningún archivo de texto.

¿Alguien puede explicarme por qué sucede esto y qué puedo hacer para obtener el resultado esperado (escribir en myfile.txt)?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El motivo del error ENOTCONN es que process.stdout no admite el evento ‘data’. Para poder escribir en el archivo, el programa necesita leer desde un flujo de lectura. Aquí, process.stdout es un flujo de escritura.

    Para solucionar esto, puedes crear un flujo de lectura a partir de process.stdin y conectarlo a process.stdout. De esta manera, se activará el evento ‘data’ y se podrá escribir en el archivo. Aquí tienes un ejemplo:

    const fs = require('fs');
    process.stdin.on('data', (chunk) => {
      fs.writeFileSync('myfile.txt', chunk, 'utf-8');
    });
    process.stdin.pipe(process.stdout);
    

    Cuando agregas una instrucción console.log() antes del programa, se retrasa ligeramente la ejecución del programa y permite que se establezcan correctamente las conexiones antes de que se escriban los datos. Por eso, en ese caso, no se produce el error.

    Para obtener el resultado esperado, puedes modificar el programa como se muestra arriba y utilizar process.stdin en lugar de process.stdout.

Comments are closed.