soy un principiante en Javascript / Nodejs.
quiero leer una carpeta, y luego cada uno por cada llamar a una función con await...
Tengo una Carpeta, dentro de esa carpeta tengo Imágenes. con readdir obtengo todas las imágenes de carpeta con extensión.
con ese código, leí la carpeta y dividí ImageName y .png, así que solo tengo ImageName sin .png.
idk si hay una solución mejor.
fs.readdir(testFolder, (err, files) => { files.forEach(file => { const split = file.split('.'); .....split[0] }); });Si agrego este código dentro del readdir
storeAsset();Código de storeAsset
async function storeAsset() { const client = new NFTStorage({ token: NFT_STORAGE_API_KEY }) const metadata = await client.store({ name: 'ExampleNFT', description: 'My ExampleNFT is an awesome artwork!', image: new File( [await fs.promises.readFile('assets/Test.png')], 'MyExampleNFT.png', { type: 'image/png' } ), }) console.log("Metadata stored on Filecoin and IPFS with URL:", metadata.url) }La función storeAsset() se ejecuta sin problemas, pero no está esperando para finalizar StoreAsset y luego cada uno por cada uno.
Si agrego, espere que el bucle forEach espere a que finalice cada archivo...;
await storeAsset();me sale este mensaje:
await storeAsset(); ^^^^^ SyntaxError: Unexpected reserved word ←[90m at ESMLoader.moduleStrategy (node:internal/modules/esm/translators:115:18)←[39m ←[90m at ESMLoader.moduleProvider (node:internal/modules/esm/loader:289:14)←[39m ←[90m at async link (node:internal/modules/esm/module_job:70:21)←[39mEntonces, ¿cómo puedo modificar la función readdir con await storeasset para que cada llamada de función espere a que finalice y luego a la siguiente?
gracias por ayudar
editar:
tengo esto ahora:
fs.readdir(testFolder, (err, files) => { files.forEach(async file => { const split = file.split('.'); // await storeAsset(); // console.log(split[0]); // process.exit(1); }); });pero esta un poco mal...
Metadata stored on Filecoin and IPFS with URL: ipfs://xxx/metadata.json 4 Metadata stored on Filecoin and IPFS with URL: ipfs://xxx/metadata.json 5 Metadata stored on Filecoin and IPFS with URL: ipfs://xxx/metadata.json 1 Metadata stored on Filecoin and IPFS with URL: ipfs://xxx/metadata.json 3 Metadata stored on Filecoin and IPFS with URL: ipfs://xxx/metadata.json 2Necesito: 1 Imagen > Subir esperar a que se devuelva la respuesta, luego 2 Imagen y así sucesivamente, y no comenzar cada carga al mismo tiempo y luego la carga es mixta y no 1,2,3,4,5...
Para que las iteraciones esperen a la anterior, y la anterior está ejecutando algo asíncrono, puede esperar usando un bucle for simple y esperar.
Los métodos de matriz como forEach no tienen un mecanismo que les permita esperar a que finalice una operación asíncrona antes de pasar a la siguiente iteración.
Finalmente, la razón por la que obtiene SyntaxError: Unexpected reserved word es que la función forEach debe ser una función asíncrona, aunque eso no resolverá el problema que está tratando aquí.
const run = async () => { for (const x of list) { await do(x) } } run()Este es un ejemplo genérico para mostrar cómo se puede usar el código asincrónico junto con readdir y un bucle.
const fs = require("fs") function pr(f) { return new Promise((resolve, _reject) => { setTimeout(function () { resolve("got file " + f) }, 500) }) } const pth = __dirname; // whatever directory path with something in it... fs.readdir(pth, async (err, files) => { // Don't use a forEach syntax as it doesn't support asynchronous code, // it would not throw an error, but the promises won't be // resolved inside the loop with forEach. for (const f of files) { const msg = await pr(f); console.log(msg) } })Y aquí hay un ejemplo que debería corresponder a su caso (no entendió completamente dónde llama al activo de la tienda y cómo usa el iterador de archivos, pero debería ilustrar el punto)
fs.readdir(testFolder, async (err, files) => { // ... for (const file in files) { await storeAsset(); } // ... });