一一读取文件并等待它们完成以继续

时间:2021-07-03 03:56:27

标签: javascript node.js

所以我将大约 3000 个日志文件转换为 MongoDB。我可以使用正则表达式匹配成功地循环浏览单个文件,而不会出现问题。但是我无法解决如何循环文件夹中的所有文件并等待每个文件完成下一个。

我的第一个想法是为数组中的每个项目触发一个函数,我提供了所有文件名。但是当然它会立即将它们全部触发,而无需等待前一个完成,只会弄得一团糟。

有人可以帮我吗? 非常感谢!

这是我目前使用的:

import mongoose from 'mongoose'
import lineReader from 'line-reader'
import { getAllFilesSync } from 'get-all-files'

mongoose
  .connect('mongodb://localhost:27017/logger', { useNewUrlParser: true, useUnifiedTopology: true })
  .then((e) => console.log('Connected to DB'))

const allDates = []

for await (const filename of getAllFilesSync(`./logs/`)) {
  let [date] = filename.match(/[0-9]{4}-[0-9]{2}-[0-9]{2}/i)
  allDates.push(date)
}

allDates.forEach((date) => {
  logToDB(date)
})

const regex = /\[[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9])?\]\s\s/

async function logToDB(date) {
  lineReader.eachLine(`./logs/${date}.log`, (line) => {
    if (regex.test(line)) {
      let [dayDate] = date.match(/[0-9]{4}-[0-9]{2}-[0-9]{2}/i)
      let [time] = line.match(/\[[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9])?\]/)
      let [, username, message] = line.match(/([a-z0-9_]+):\s(.*)/)
      const Logger = mongoose.model('logs', MessagesSchema)
      new Logger({
        date: new Date(`${dayDate} ${time}`),
        username: username,
        message
      }).save()
    }
  })
}

1 个答案:

答案 0 :(得分:0)

试试这个:

const fs = require('fs');
    const readline = require('readline');
    
    async function processLineByLine( filename ) {
      const fileStream = fs.createReadStream(filename);
    
      const rl = readline.createInterface({
        input: fileStream,
        crlfDelay: Infinity
      });
    
      for await (const line of rl) {
        // Each line in input.txt will be successively available here as `line`.
        //Do whatever you need to do with mongoDB here
        console.log(`Line from file: ${line}`);
      }
    }

    //Create a list of your file names;
    const files = [];

    files.forEach(file => {
        await processLineByLine(file);
    });