如何遍历 "line-by-line" npm 中的所有行?

How to iterate through all lines in "line-by-line" npm?

作为一种临时方法,我使用.txt 文件来存储我程序的某些变量。用 fs.appendFile 书写完美,但考虑到它的大小,用 fs.readFile 阅读是不合适的 - 我想从文件中获取 某行 , npm line-by-line 有人告诉我可能会有帮助。

不过我有点迷茫了。这是我调用的函数:

function YTAPP_LBL_SetValueToLine(path, lineid, value){

    var lr = new lblreader(path);
    var m = 0;

    lr.on('line', function (line) {
        // 'line' contains the current line without the trailing newline character.
        m=+1;
        if(m==lineid){ value = line; };
    });

};

并且调用本身作为普通函数调用发生,所有输入变量肯定正确。

我应该认为这不是一个正确的方法,但是文档说,这是 synchronous 方法。但是,我可以看到.on的工作是asysnc,因为它需要函数输入。

不确定这是否与问题有关,但无论如何,console.log函数调用后始终指示变量未更改。

我该怎么做?

您可以使用核心节点 API 提供的 Readline 模块。

Readline API Example for Line-by-Line

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

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

rl.on('line', (line) => {
  console.log('Line from file:', line);
});

以上示例取自Node Readline API Docs

变量没有改变,因为videoid是按值传入的。这意味着在函数内对其进行的任何更改都不会反映在变量本身上。

例如:

function increment(num) {
  num++;
}
var a = 1;
increment(a);
console.log(a); // 1

要传递一个会被函数更改的变量,您需要传递一个对象类型。

例如:

function increment(num) {
  num.val++;
}
var a = {val: 1};
increment(a);
console.log(a); // Object {val: 2}

要将此应用于您的程序,您需要创建一个对象来保存 videoid 并在您完成阅读后关闭流:

var videodata = {videoid: 'someID'};
function YTAPP_LBL_SetValueToLine(path, lineid, viddata){

  var lr = new lblreader(path);
  var m = 0;

  lr.on('line', function (line) {
    // 'line' contains the current line without the trailing newline character.
    m += 1;
    if(m == lineid){ 
      viddata.videoid = line;

      // Close the stream
      lr.close();
    }
  });



};