如何在nodejs中访问其函数范围之外的局部变量值

how to access a local variable value outside the scope of its function in nodejs

我想比较两个文件的数据,为此,我正在使用 fs 模块读取该文件,但由于我想比较这些值,所以我想将值存储在外部变量中,但是当我do console.log(budget_details) 我在控制台中什么也得不到。请有人帮忙。如果我的方法有误,或者我们不需要在 nodejs 中这样做,请指出我。我是 nodejs 的新手。

import csv from 'csv-parser'
import fs from 'fs';

let budget_details
const budgetProcessing = (budget_file_path) => {
    try{
        fs.createReadStream(budget_file_path)
            .pipe(csv())
            .on('data', (row) => {
                budget_details = row
            })
            .on('end', () => {
                console.log('CSV file successfully processed');
            });
    }
    catch(error){
        console.log(error)
    }
}

budgetProcessing('budget.csv')

console.log(budget_details)

您的代码不是异步的。带有函数的 'on' 的任何东西都表明它是事件驱动的。你需要这样的东西:

import csv from 'csv-parser'
import fs from 'fs';

let budget_details
const budgetProcessing = (budget_file_path) => new Promise((resolve, reject) => {
  try {
    fs.createReadStream(budget_file_path)
      .pipe(csv())
      .on('data', (row) => {
        budget_details = row
      })
      .on('end', () => {
        console.log('CSV file successfully processed');
        resolve()
      });
  } catch (error) {
    console.log(error)
    reject(error)
  }
})

budgetProcessing('budget.csv')
  .then(() => console.log(budget_details))

先解释一下为什么没有得到预期的结果,其实和作用域没有关系:

import csv from 'csv-parser'
import fs from 'fs';

let budget_details
const budgetProcessing = (budget_file_path) => {
    try{
        fs.createReadStream(budget_file_path)
            .pipe(csv())
            .on('data', (row) => {
                budget_details = row
            })
            .on('end', () => {
                console.log('CSV file successfully processed');
            });
     }
    catch(error){
        console.log(error)
    }
}

budgetProcessing('budget.csv')

console.log(budget_details)

fs.createReadStream 本身并不是完全异步的,但是我们将返回的流通过管道传输到 csv-parser,它会进行基于事件的解析,所以即使您在 console.log(budget_details) 之前调用 budgetProcessing 流读取很可能尚未运行并且 budget_details 仍未定义。

要解决此问题,您可以将此 console.log(budget_details) 移动到如下设置的位置:

    let budget_details
    const budgetProcessing = (budget_file_path) => {
        try{
            fs.createReadStream(budget_file_path)
                .pipe(csv())
                .on('data', (row) => {
                    budget_details = row
                    console.log(budget_details)
                })
                .on('end', () => {
                     console.log('CSV file successfully processed');
                });
         }
         catch(error){
            console.log(error)
        }
    }

    budgetProcessing('budget.csv')

但是变量本身不会起到任何实际作用,所以您可以这样做:

    const budgetProcessing = (budget_file_path, callback) => {
        try{
            fs.createReadStream(budget_file_path)
                .pipe(csv())
                .on('data', (row) => {
                    callback(row)
                })
                .on('end', () => {
                     console.log('CSV file successfully processed');
                });
                
         }
         catch(error){
            console.log(error)
        }
    }

    budgetProcessing('budget.csv', (budget_details) => {
        console.log(budget_details) // or anything with budget_details
    })

最后,我想明确指出,将按照 csv-parser 的文档

中指定的 csv 的每一行调用回调