Чтение CSV с фс и событиями, проблема в манипулировании данными для области действия функции. С nodejs и шутка - PullRequest
1 голос
/ 25 апреля 2020

Мне нужна помощь с одной вещью:

У меня есть функция, которая генерирует массив объектов, следующим образом:

const parse = require('csv-parse');
const fs = require('fs');

async function dadosCsv(arquivo){
  let csvData = []
  fs.createReadStream(arquivo)
  .pipe(
    parse({
        columns: true,
    })
  )
  .on('data', async(row) =>{
    csvData.push(row)
  })
  .on('end', async() =>{
    return csvData
  })
}

module.exports = dadosCsv;

Затем я пытаюсь использовать этот массив в отдельном тесте. файл с использованием методов jest

const dadosCsv = require('../helper/dadosCsv')
// Log function
console.log(dadosCsv);

describe("Testando", () => {
    dadosCsv(__dirname + '/importar_notas_sp.csv')

    test('Cenario', async() =>{
        csvData.forEach(function(item) {
          // Trying to log data from within the array into the above function
          console.log(JSON.parse(item.msgRetorno))
        })
    })
})

Произошла ошибка, obs: я могу получить асинхронную функцию другого файла, но не могу использовать массив из него:

Попытка войти данные из массива в вышеуказанную функцию ReferenceError: csvData не определена

      21 |     
      22 |     test('Cenario', async() =>{
    > 23 |         csvData.forEach(function(item) {
         |         ^
      24 |           console.log(JSON.parse(item.msgRetorno))
      25 |         })
      26 |     }) 

      at Object.<anonymous> (src/importar_notas_SP.test.js:23:9)

Функция журнала:

  console.log src/importar_notas_SP.test.js:20
    [AsyncFunction: dadosCsv]

1 Ответ

0 голосов
/ 25 апреля 2020

Уэсли, похоже, вы новичок в Nodejs, неважно, но вам не хватает нескольких вещей в коде. Я немного изменяю код. Я также предлагаю вам больше узнать о promises и async-await. Вы должны правильно обрабатывать вызов функции dadosCsv(__dirname + '/importar_notas_sp.csv'), а также возвращать обещание функции dadosCsv

const parse = require('csv-parse');
const fs = require('fs');

function dadosCsv(arquivo) {
    let csvData = []
    return new Promise(function(resolve, reject) {
        fs.createReadStream(arquivo)
            .pipe(
                parse({
                    columns: true,
                })
            )
            .on('data', async (row) => {
                csvData.push(row)
            })
            .on('end', async () => {
                resolve(csvData)
            })
            .on('error', (err) => {
                reject(err)
            })
    })
}
module.exports = dadosCsv;

================= ==== Тестовый файл =======================

const dadosCsv = require('../helper/dadosCsv')
describe("Testando", () => {

    test('Cenario', async () => {
        let csvData = await dadosCsv(__dirname + '/importar_notas_sp.csv')
        csvData.forEach(function(item) {
            // Trying to log data from within the array into the above function
            console.log(JSON.parse(item.msgRetorno))
        })
    })
})

Я создал repl для вас, попробуйте поиграть с ним и найти больше о promise и async-await https://repl.it/repls/LovingUprightMp3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...