Я изучаю NodeJS и сталкиваюсь с основной проблемой. Я пытаюсь прочитать файл построчно и для каждой прочитанной строки отправить HTTP-запрос на / + <the line>, например:

Содержание 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
toti 3 Май 2019 в 13:00

3 ответа

Лучший ответ

Вы можете сделать это просто так:

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);
});
0
Sang Huynh 3 Май 2019 в 10:09

Readline является асинхронным, поэтому есть вероятность, что console.log вызывается до завершения fileLoader. Попробуйте использовать readline-sync, если вы счастливы блокировать, пока файл читается.

В противном случае вам следует переписать, чтобы метод on ('line', ...) выполнял действие, которое вы хотите выполнить со строкой во время чтения. (Я думаю, это то, что вы хотите - «читать файл построчно, и для каждой прочитанной строки отправлять HTTP-запрос»). Например.

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

Или, если вы хотите действовать только тогда, когда весь файл читается, вам придется изменить структуру так, чтобы чтение файла было заключено в обещание (или использовать async / await).

0
user2771365 3 Май 2019 в 10:33