Javascript 如何将async/await与节点js中的fs.createReadStream一起使用

Javascript 如何将async/await与节点js中的fs.createReadStream一起使用,javascript,node.js,Javascript,Node.js,我有NodeJS服务,它读取csv文件并根据提供的参数过滤记录。我需要等到文件读取处理完毕。但不是等待。我尝试使用async/Wait和promise,但没有成功 如何等待文件被处理并返回json响应 app.get('/getEmpInfo/:emailId/:unique_code', async (req,res) => { console.log("req.params.emailId :"+req.params.emailId); console.log("req

我有NodeJS服务,它读取csv文件并根据提供的参数过滤记录。我需要等到文件读取处理完毕。但不是等待。我尝试使用async/Wait和promise,但没有成功

如何等待文件被处理并返回json响应

app.get('/getEmpInfo/:emailId/:unique_code', async (req,res) => {
    console.log("req.params.emailId :"+req.params.emailId);
    console.log("req.params.unique_code :"+req.params.unique_code);
    const response = await getEmpDetailsByEmailIdAndUniqueCode(req.params.emailId,req.params.unique_code);
    res.send(response)
}); 

async function getEmpDetailsByEmailIdAndUniqueCode(emailId,uniqueCode){
    console.log("inside getEmpDetailsByEmailIdAndUniqueCode()::"+emailId+"::"+uniqueCode);
    var fetchData = [];

    // try 1
/*  await fs.createReadStream(investorFileName1)
      .pipe(csv())
      .on('data', (row) => {
        if(row.unique_code != null && row.unique_code == uniqueCode && row.investor_email_id == emailId) {
            fetchData.push(row);
            console.log(row);
        }
      })
      .on('end', () => {
        console.log('CSV file successfully processed');
        console.log(fetchData);
    }); */

  // try 2
    var response = fs.createReadStream(fileName).pipe(csv());

    return new Promise(function(resolve,reject){
        response.on('end', () => resolve(fetchData));
        response.on('error', reject); 
    })
}

你很接近。只需将两个实现合并到第三个实现中:

异步函数GetEmpDetailsByMaildAndUniqueCode(文件名、电子邮件ID、唯一代码){ log(“GetEmpDetailsByMaildAndUniqueCode()::”+emailId+::“+uniqueCode内部”); 返回新承诺(功能(解决、拒绝){ var fetchData=[]; fs.createReadStream(文件名) .pipe(csv()) .on('数据',(行)=>{ if(row.unique\u code!=null&&row.unique\u code==uniqueCode&&row.investor\u email\u id==emailId){ fetchData.push(行); 控制台日志(行); } }) .on('end',()=>{ console.log('CSV文件已成功处理'); console.log(fetchData); 解析(获取数据); }) .on('错误',拒绝); }) } 注意,我添加了
fileName
作为第一个参数,因为我在代码中的任何地方都看不到它的定义


我也没有测试它,只是把代码粘在一起:)。

请使用下面的代码

const getEmpDetailsByEmailIdAndUniqueCode = () => {
 return new Promise((resolve, reject) => {
  const fetchData = [];
let stream = fs.createReadStream(investorFileName1);
stream.on("error", err => reject(err));
stream.on('data', (row) => {
    if(row.unique_code != null && row.unique_code == uniqueCode && 
        row.investor_email_id == emailId) {
        fetchData.push(row);
        console.log(row);
    }
  })
stream.on("end", () => resolve(fetchdata));
 });
}

如果您想为每个请求检查同一个文件,那么最好只解析一次数据并将其保存在某个变量中,而不是反复读取该文件?