Estoy buscando ser educado sobre este problema ya que he pasado unos días tratando de resolverlo por mi cuenta, sin éxito.
Estoy usando csv-parse para analizar un archivo CSV.
Estoy usando ESLint como mi Linter
Estoy usando el complemento de la guía de estilo de JavaScript de Airbnb para ESLint
Estoy ejecutando esto en el backend usando NodeJS
mi función es:
const { parse } = require('csv-parse'); const fs = require('fs'); const csvFile = 'myCsvFile.csv'; async function parseCsv(csvFile) { const records = []; const parser = fs.createReadStream(csvFile).pipe(parse({ delimiter: ',', columns: true })); for await (const record of parser) { records.push(record); } return records; La función funciona bien, sin embargo, estoy tratando de cumplir con la Guía de estilo de Airbnb, a la que no le gusta el bucle for await...of , ya que me está golpeando con la violación no-restricted-syntax .
Tengo curiosidad por saber si hay una mejor manera de escribir esto para estar en línea con la Guía de estilo de Airbnb o si esta es una de esas situaciones en las que está bien ignorar la infracción.
La guía de estilo dice:
11.2 No use generadores por ahora. ¿Por qué? No se transpilan bien a ES5.
Afortunadamente, si está usando una versión reciente de NodeJS, no necesita transpilar y puede usar el soporte nativo del motor. Para los navegadores, este consejo también quedará obsoleto pronto.
¿Qué hay de usar los eventos y devolver la promesa?
const { parse } = require('csv-parse'); const fs = require('fs'); const csvFile = 'myCsvFile.csv'; async function parseCsv(csvFile) { return new Promise((resolve) => { const records = []; const stream = fs.createReadStream(csvFile); const parser = stream.pipe(parse({ delimiter: ',', columns: true })); parser.on('readable', () => { while (record = parser.read()) { records.push(record); } }); let ended = false; const end = (error) => { if (error) { console.error(error.message); } if (!ended) { ended = true; resolve(records); } }; parser.on('error', end); parser.on('end', end); }); }también si tiene el nodo 15+, intente el ejemplo de transmisión/promesas :
const { parse } = require('csv-parse'); const fs = require('fs'); const { finished } = require('stream/promises'); const csvFile = 'myCsvFile.csv'; async function parseCsv(csvFile) { const records = []; const stream = fs.createReadStream(csvFile); const parser = stream.pipe(parse({ delimiter: ',', columns: true })); parser.on('readable', () => { let record; while ((record = parser.read()) !== null) { records.push(record); } }); await finished(parser); return records; }Según los consejos dados en las respuestas, ignoraré la Guía de estilo de Airbnb y usaré el método iterador Async .
Código definitivo:
const { parse } = require('csv-parse'); const fs = require('fs'); const path = require('path'); const debug = require('debug')('app:csv:service'); const chalk = require('chalk'); async function parseCsv(csvFile) { try { const records = []; const stream = fs.createReadStream(csvFile); const parser = stream.pipe(parse({ delimiter: ',', columns: true })); // eslint-disable-next-line no-restricted-syntax for await (const record of parser) { records.push(record); } return records; } catch (error) { debug(`${chalk.red('Failed')} to parse CSV`); debug(`${chalk.red('ERROR:')} ${error}`); throw error; } }Puede que sea el momento de encontrar una nueva guía de estilo a seguir. Gracias a num8er por el consejo sobre el código (tomé una de sus ideas para hacer que mi código sea un poco más legible).