Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

343
Vistas
Leer y escribir archivos de 'fs' no funciona de forma asíncrona

Estoy tratando de construir un script que lea y escriba algunos archivos. Las funciones funcionan bien, pero tengo problemas para realizar las funciones de lectura/escritura de forma asincrónica. El principal problema que tengo es que estoy tratando de escribir un archivo y luego estoy tratando de importarlo. Por ejemplo: dadas estas dos funciones, la primera está escribiendo en ./myFile.js y la segunda función está tratando de importar el archivo de esta manera:

 var fs = require('fs'); const myFile = require('./myFile') async function writeMyFile() { return new Promise((resolve, reject) => { fs.promises.readFile('./myFile.js', 'utf8').then((file) => { const replacedData = file + 'newLine' fs.promises .writeFile('./myFile.js', replacedData) .then(() => resolve('Writted')) .catch(() => reject('Error')); }); }); } function importMyFile() { console.log(myFile) // this is always empty } await writeMyFile() importMyFile()

Lo que pasa es que puedo ver que myFile se está escribiendo correctamente, pero no puedo verlo en la función importMyFile . Cuando pruebo estas funciones por separado funciona (ejecutando la primera y luego la segunda)

Intenté lo siguiente:

  • Uso de las funciones de promise de la biblioteca fs : fs.promises.readFile() y fs.promises.writeFile() (ejemplo anterior)
  • Devolver una Promesa que se resuelve cuando finaliza writeMyFile . (ejemplo arriba)
  • Importando el archivo directamente en la función readMyFile de esta manera:
 function importMyFile() { const myFile = require('./myFile') console.log(myFile) // this is always empty }
  • Sin volver nueva Promesa como esta:
 async function writeMyFile() { const file = await fs.promises.readFile('./myFile.js', 'utf8') const replacedData = file + 'newLine' await fs.promises.writeFile('./myFile.js', replacedData) }

Tambien veo que en la consola, el orden de los logs son estos:

 'Writted' {} //empty file

Tenga en cuenta que esta es una versión simplificada de mi caso.

EDITAR el archivo que estoy tratando de escribir e importar se ve así SIEMPRE:

 module.exports = []

Y el que está poblado, se ve así:

 const myModule = { name: 'name', surname: 'surname' } module.exports = [myModule]

Espero que alguien sepa lo que está pasando aquí. ¡Gracias!

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Usar require es diferente a readFile . El uso de require carga el archivo .js como un módulo y trae sus elementos exportados para usarlos en su código. Si solo está interesado en imprimir el texto dentro del archivo .js, use fs.readFileSync para hacerlo (no necesita promesas si usa la versión síncrona de la llamada).

El código que tiene agregará la cadena "nueva línea" al final del archivo, pero si su intención era agregar una nueva línea real, debería agregar "\n" en su lugar.

Una versión más simple de su código podría verse así:

 function writeMyFile() { const file = fs.readFileSync('./myFile.js', 'utf8'); const replacedData = file + '\n'; fs.writeFileSync('./myFile.js', replacedData); return 'Written'; } function importMyFile() { // actually read the file instead of using require() const file = fs.readFileSync('./myFile.js', 'utf8'); console.log(file); } writeMyFile() importMyFile()

Dado que no se realizan llamadas asincrónicas, no hay necesidad de promesas o esperas.

Si tenía la intención de usar el código .js en el interior, y es importante usar require , tenga en cuenta que una vez que lo carga de esa manera en la memoria, no se actualiza después de que cambia el archivo en el disco. Incluso si llama para require una vez más, será inteligente y dirá "oh, ya tengo ese en la memoria" y no lo recargará. Por lo tanto, retrase la llamada a require('./myFile') hasta que se realicen los cambios necesarios y coloque la instrucción require dentro de importMyFile() .

about 4 years ago · Juan Pablo Isaza Denunciar

0

await writeMyFile() importMyFile()

Tiene que estar dentro de una función asíncrona.

Por ejemplo, llamándolos así, y esto debería funcionar.

 (async ()=>{ await writeMyFile() importMyFile() })()

Además, la salida, {} significa que no hay ningún módulo exportado desde myfile.js.

Editar: la variable "myFile" contiene datos antiguos. Tal como fue importado al inicio de la ejecución. importMyFile debería volver a importar myfile.js.

 function importMyFile() { myFile = require('./myFile') console.log(myFile) }

Después de esto, los nuevos cambios realizados por writeMyFile se mostrarán en la consola, si la función cambió la exportación de myfile.js .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda