NodeJS在函数内调用readline

时间:2019-05-03 10:00:14

标签: node.js

我正在学习NodeJS,遇到一个基本问题。我正在尝试逐行读取文件,并且读取的每一行都向/ + <the line>发送HTTP请求,例如:

wlist.txt内容

line 
line2

尝试失败

const request = require('request') // for http request later
const readline = require('readline')
const fs = require('fs')
function fileLoader() {
  const readInterface = readline.createInterface({
    input: fs.createReadStream('C:\\etc\\code\\req\\wlist.txt'),
  });
  readInterface.on('line', function(line) {
    return "test";
  });
}

var aba = fileLoader();
console.log(aba); // undefined

我将fileLoader作为函数而非“按原样”插入的逻辑是,我后来有了一个开关盒,该开关盒将文件加载用于不同的目的(例如XML请求或JSON请求)。

switch (myArgs[0]) {
  case 'json':
  let myJSON = {username: 'val'};
  request({
  url: "http://192.168.1.2:3000",
  method: "POST",
  json: true,
  body: myJSON
  }, function (error, response, body){
    console.log(response.headers)
    console.log(response.body)
  });
    break;

  case 'xml': .....

我完全知道我缺少一些东西,可能是关于异步/诺言或其他任何东西,但是要真正地进行教育,请有人对我轻松一点,向我展示一下方法吗?我已经尝试了一切,只是无法理解问题所在。.

3 个答案:

答案 0 :(得分:1)

我相信您想做这样的事情: https://gist.github.com/EB-BartVanVliet/533d55eb17c97f2a12ed25f479786f4a

基本上我要做的是:

  • 解析文件,查找空行并将其删除
  • 我声明了一个异步启动函数,以便可以在for循环内使用await
  • 记录输出

答案 1 :(得分:0)

您可以这样简单:

var sendRequest = function (input) {
  // Do whatever you want here 
}
var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('path_to_your_file')
});

lineReader.on('line', function (line) {
  console.log('Line from file:', line);
  sendRequest(line);
});

答案 2 :(得分:0)

readline是异步的,因此有可能在fileLoader完成之前调用console.log。如果您愿意在读取文件时进行阻止,请尝试使用readline-sync。

否则,您应该重新编写,以便on('line',...)方法在读取行时执行您要对行执行的操作。 (我想这就是您想要的-“逐行读取文件,并且每读取一行以发送HTTP请求”)。例如

on('line', (input) => { /* perform send http stuff/call function to do it */ } );

或者,如果您只想在读取整个文件时采取措施,则必须重新组织结构,以便将读取的文件包装在promise中(或使用async / await)。