Actualmente estoy desarrollando una aplicación con React y Mongoose (MongoDB) donde cargo un archivo de texto, que contiene aproximadamente alrededor de 9000+ líneas, que contiene JSON. Cada línea es importante y necesito poder almacenarla en la base de datos para poder acceder a ella más tarde.
Configuré dos funciones, una que lee el archivo y otra que crea un modelo para cada solicitud y lo guarda en MongoDB.
Función para leer cada línea
const createAndReadFile = async (filePath) => { //create a read stream of the File let fileStream = fs.createReadStream(filePath, 'utf8'); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity }); for await (const line of rl) { let parsedJSONLine = JSON.parse(line); createAndAddToDB(parsedJSONLine); } };Función para agregar a la base de datos cada línea.
const createAndAddToDB = async (jsonRequest) => { try { let request = new Request(jsonRequest); await request.save(); } catch (error) {} };Mi pregunta es, ¿cuál es la forma más efectiva de esperar hasta que todas las líneas se hayan convertido en un modelo y se hayan guardado en la base de datos?
Use Promise.all para esperar la resolución de todas las promesas que se crean en el ciclo de espera:
var promises = []; for await (const line of rl) { let parsedJSONLine = JSON.parse(line); promises.push(createAndAddToDB(parsedJSONLine)); } return Promise.all(promises);Alternativamente, puede realizar la conversión en el bucle for-await y escribir en la base de datos en un lote:
var promises = []; for await (const line of rl) { let parsedJSONLine = JSON.parse(line); promises.push(convertToDBFormat(parsedJSONLine)); } return Promise.all(promises).then(function(converted) { return addToDBBatch(converted); });const createAndReadFile = async (filePath) => { //create a read stream of the File let fileStream = fs.createReadStream(filePath, 'utf8'); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity }); for (const line of rl) { let parsedJSONLine = JSON.parse(line); await createAndAddToDB(parsedJSONLine); } return 'file is processed'; };Lo has escrito correctamente, supongo. Cuando termine el ciclo, será la última línea del archivo.
Ahora, si hay líneas que no se guardan, puede enviarlas a la matriz fallida y guardarlas en los lotes.
Sugerencia: también, en lugar de guardar cada línea en la base de datos cada vez que hay muchas solicitudes de más de 9000 (líneas), debe usar la inserción por lotes. Cuando esté fuera del circuito, puede verificar nuevamente si hay líneas que no se guardaron. Vuelva a ejecutar la función de guardado por lotes y estará listo para comenzar.