Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

207
Views
Leyendo el archivo solo después de que la función haya terminado

Tengo una función doSmth que crea un archivo "data.json" al final. (el archivo SE crea al final de la ejecución del script). Sin embargo, cuando intento fs.readFileSync usando await y luego, dice

 Error: ENOENT: no such file or directory, open 'data.json'

aquí está mi código

 const doSmth = async() => { await zip.forEach(async(relativePath: any, file: any) => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) } }) } await doSmth().then(async () => { const fs = require("fs"); console.log("reached") fs.readFileSync("data.json") })

¿Cómo espero a que se cree el archivo data.json antes de leerlo?

Editar: de los comentarios cambié mi código a esto y funciona

 const doSmth = async() => { await Promise.all(zip.forEach(async(relativePath: any, file: any) => { return new Promise(resolve => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }

pero ahora tengo una espera dentro y causa el mismo error de archivo de datos no encontrado

 const doSmth = async() => { await Promise.all(zip.forEach(async(relativePath: any, file: any) => { return new Promise(async resolve => { const eachFile = await zip.file(file.name).async("string") const jsonObject = JSON.parse(eachFile) const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }
about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

el problema es que no está escribiendo el archivo de forma sincrónica en su bloque catch

 const doSmth = async() => { await zip.forEach(async(relativePath: any, file: any) => { const fs = require("fs"); try { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) } catch (error) { console.log("file didnt exist") fs.writeFileSync('data.json', JSON.stringify("")); // Yes, writeFileSync does create a new file when the file is not exists // So even this catch is redundant, use fs.existsSync if you really need to know the file exists or not } }) }

o es posible que desee hacer una primisificación adecuada para cada cosa

about 4 years ago · Juan Pablo Isaza Report

0

Está utilizando await, pero no está devolviendo promesas.

Usaremos Promise.all para esperar todas las promesas, y para cada archivo zip, devolveremos una new Promise cuando termine llamando a resolve()

 const doSmth = async() => { await Promise.all(zip.map(async(relativePath: any, file: any) => { return new Promise(resolve => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }

PD: No conté los paréntesis de cierre, edítelos en consecuencia.

PS2: su data.json debe estar vacío ya que está usando JSON.stringify("") que es una cadena vacía

si quieres hacer las cosas secuencialmente

 import fs from 'fs'; const fsPromises = fs.promises; const doSmth = async () => { return new Promise(async resolve => { for (let i = 0; i < zip.length; i++) { const file = zip[i]; if (await fsPromises.exists(file)) { await fsPromises.writeFile('data.json', file); } } resolve(); //End the function by returning a promise. }) }
about 4 years ago · Juan Pablo Isaza Report

0

No mezcle ni combine async/await con then . Parece que quieres hacer algo como esto.

 const fs = require('fs'); async function main() { await doSmth(); console.log('reached'); fs.readFileSync('data.json'); } main();

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!