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() } }) })) }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
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
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. }) }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();