在nodejs中rl.close()发出后,readline不会停止读取行

gvo*_*igt 7 readline node.js

我有以下文件我想逐行阅读并在找到"nameserver 8.8.8.8"后停止阅读.

nameserver 8.8.8.8
nameserver 45.65.85.3
nameserver 40.98.3.3
Run Code Online (Sandbox Code Playgroud)

我正在使用nodejs和readline模块这样做

const readline = require('readline');
const fs = require('fs');

function check_resolv_nameserver(){
  // flag indicates whether namerserver_line was found or not
  var nameserver_flag = false;

  const rl = readline.createInterface({
    input: fs.createReadStream('file_to_read.conf')
  });

  rl.on('line', (line) => {
    console.log(`Line from file: ${line}`);
    if (line === 'nameserver 8.8.8.8'){
      console.log('Found the right file. Reading lines should stop here.');
      nameserver_flag = true;
      rl.close();
    }
  });

  rl.on('close', function(){
    if (nameserver_flag === true){
      console.log('Found nameserver 8.8.8.8');
    }
    else {
      console.log('Could not find nameserver 8.8.8.8');
    }
  });
}

check_resolv_nameserver();
Run Code Online (Sandbox Code Playgroud)

因为我在读完第一个匹配后立即用rl.close()发出一个close事件,我希望我的Code只读取第一行然后再继续读取.但相反,我的输出看起来像这样

Line from file: nameserver 8.8.8.8
Found the right file. Reading lines should stop here.
Found nameserver 8.8.8.8
Line from file: nameserver 45.65.85.3
Line from file: nameserver 40.98.3.3
Run Code Online (Sandbox Code Playgroud)

如何在第一场比赛后让readline停止并让我继续其他事情?

Oz *_*bat 14

对于那些无法让 linereader 停止的人,请执行以下操作(在您的 readline 回调中):

lineReader.close()
lineReader.removeAllListeners()
Run Code Online (Sandbox Code Playgroud)


Fes*_*sto 1

您还应该关闭流:

const readline = require('readline');
const fs = require('fs');
const readStream = fs.createReadStream('file_to_read.conf');

// More code here ...

const rl = readline.createInterface({
    input: readStream
  });

// Rest of your code

rl.close();
readStream.destroy();
Run Code Online (Sandbox Code Playgroud)