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:
promise de la biblioteca fs : fs.promises.readFile() y fs.promises.writeFile() (ejemplo anterior)writeMyFile . (ejemplo arriba)readMyFile de esta manera: function importMyFile() { const myFile = require('./myFile') console.log(myFile) // this is always empty } 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 fileTenga 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!
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() .
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 .