在回调函数外访问 node.js 中 readline & fs 解析的数据

Accessing data parsed by readline & fs in node.js outside of the callback function

这个问题不同于链接的那个已经有答案的问题。具体是这段代码改编自 node.js 文档,关于 fs 和 readfile 的使用以及寻找文件结束标志,我了解到这是 readfile.close 方法。谢谢你的回答。

我在本地编写了一个小实用程序,试图将 key:value 对的文本文件转换为 JSON 文件,以便在 React 项目中使用。

我直接从 node.js 文档中获得了 readline 函数的基础。我在 mac

上使用节点 6.9.0

这是完整的脚本:

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

const rl = readline.createInterface({
  input: fs.createReadStream('usat-ncaa-programs.txt')
});

var newPairs=["test"];
rl.on('line',
  function (line) {
  if (line===null){
    newPairs.push("}], [ {")
  } else if (line) {
    var keyValue = line.match(/^(.*):(.*)/)
    var newKeyValuePair =  "'" + keyValue[1].trim() + "':  '" + keyValue[2].trim() + "'"
    newPairs.push(newKeyValuePair)
    //console.log (newKeyValuePair)
  }

})

console.log(newPairs)

输入文件看起来像这样(大约有 12 个程序),我只包含 2 1/2 所以你可以看到格式:

University: Arizona State University
Division: I
University Home Page: http://www.asu.edu/
Recruiting Link: https://questionnaire.acsathletics.com/Questionnaire/Questionnaire.aspx?&SPSID=1061112&SPID=177408&DB_LANG=C&DB_OEM_ID=30300&q=2015&s=159130&o=143
Team Homepage: http://www.thesundevils.com/index.aspx?path=triathlon
Head Coach: Cliff English
w: 480.965.0546
e: cliff.endlish@asu.edu
bg-color: #990033
color: #FFB310

University: Belmont Abby College
Division: II
University Home Page: http://belmontabbeycollege.edu/
Recruiting Link: https://coach.scoutforce.com/p/414f3219dd
Team Homepage: http://abbeyathletics.com/sports/wtri/index
Head Coach: Nick Radkewich
w: 704.461.5010
e: NicholasRadewich@bac.edu
Twitter: https://twitter.com/AbbeyTri
bg-color: #FFFDD0
color: #DC143C

University:Black Hills State University 
Division: II
University Home Page: http://www.bhsu.edu/
...

我的问题是,虽然我可以逐行读取文本文件并解析一些看起来像 JSON 文件的信息,但我无法在回调函数之外访问该数据。

我不知道如何将这些数据保存到新文件中,甚至不知道如何将对象输出到我的控制台以进行剪切和粘贴并手动编辑。

在上面的脚本中,变量 newPairs 的记录输出是 ["test"] 而不是我试图完成的逐行解析。

如果我将 console.log 放在回调中,我会在读取文件的每次迭代时记录信息。我只想在文件完成后处理数据。

我在 fsreadline 的节点文档中没有找到 EOF 或类似标志。

此外,如果有更简单的方法将我输入的数据转换为 JSON 格式,我很想听听。提前致谢。

你要明白,回调函数是异步执行的。这意味着 console.log(newPairs) 在回调之前执行,因此它只会导致 "test".

你应该听听 Readline 的 close event,像这样:

rl.on('close', function() {
  console.log(newPairs);
});

如文档所述:

The 'close' event is emitted when one of the following occur:

  • The rl.close() method is called and the readline.Interface instance has relinquished control over the input and output streams;
  • The input stream receives its 'end' event; The input stream receives -D to signal end-of-transmission (EOT);
  • The input stream receives -C to signal SIGINT and there is no SIGINT event listener registered on the readline.Interface instance.
  • The listener function is called without passing any arguments.

The readline.Interface instance should be considered to be "finished" once the 'close' event is emitted.

这就是您正在寻找的 'EOF':-)

我知道这是一个老问题,但答案对我没有帮助。您可以使用这样的承诺:

function readLineAsync(){
 var data = [];
 var i = 0;
 return new Promise((resolve,reject)=>{
     var lineRead = readLine.createInterface({
         input:fs.createReadStream('path.to.file')
     })
     lineRead.on('line',(line)=>{
        data[i] = line;
        i++; 
     })
     lineRead.on('close',()=>{
        resolve(dataCsv);
     })
 })
}
(async function(){ console.log(await readLineAsync())}())