Node.js , используя async/ await с функцией readline.on

#javascript #node.js #readline

#javascript #node.js #строка чтения

Вопрос:

Я хочу прочитать файл, который имеет kye и значение.

Я использую ‘readline’ для чтения построчно и сохраняю его в объекте map.

Но он не работает и показывает только, что «не определено».

У вас, ребята, есть какие-либо идеи о том, как это исправить?

Заранее большое спасибо

 #!/usr/bin/env node
const fs = require('fs');
const readline = require('readline');
const hg = require('./js/funtions.js');
if (require.main === module) {
  const args = process.argv
  var propertiesPath;
  if(args.length >= 3){
    propertiesPath = args[2];
  }else {
    console.log("No properties path");
    process.exit(1);
  }
  if (propertiesPath.includes("-p")) {
    propertiesPath = propertiesPath.replace("-p","");
  }

  const file = readline.createInterface({
    input: fs.createReadStream(propertiesPath),
    output: process.stdout,
    terminal: false
  });
  var map = new Map();
  var tokens,key,value;
  file.on('line', (line) => {
    tokens = line.split("=")
    key   = tokens[0];
    value = tokens[1];
    map.set(key,value);
  });
 
  var jsonPath = map.get("jsonPath");
  console.log(jsonPath);
}
 

Ответ №1:

используя async / await с функцией readline.on

Вы не используете await / async в своем коде.

Кроме того, это file.on('line', …) регистрирует обратный вызов, который должен вызываться для каждого line потока, с которым сталкивается поток, и это происходит асинхронно. Из-за этих двух строк кода выполняются до того, как какая-либо строка в файле была найдена readline :

 var jsonPath = map.get("jsonPath");
console.log(jsonPath);
 

Если вы хотите выполнить эти две строки кода после того, как все строки были прочитаны потоком, вам нужно сделать это на close событии:

 file.on('close', () => {
  var jsonPath = map.get("jsonPath");
  console.log(jsonPath);
});
 

Комментарии:

1. Но мне все равно нужно использовать ‘JSONPath’ для выполнения другой работы. вне функции закрытия. JSONPath по-прежнему показывает undefined.

2. @HaniLee это та же проблема, что и ваш console.log(jsonPath); внешний close обратный вызов вызывается до чтения строк. Вот как работает асинхронный код. Вам следует провести некоторое исследование о том, как работает асинхронный код, и о существующих возможностях работы с асинхронным кодом, например, используя обещания в сочетании с await и async .

Ответ №2:

После проведения исследования. Я решил не использовать функцию async / await. Поэтому я использовал простую логику для чтения файла и анализа объекта сопоставления. Вот мой код.

 #!/usr/bin/env node
const fs = require('fs');
const readline = require('readline');
const hg = require('./js/funtions.js');

if (require.main === module) {
  const args = process.argv
  var propertiesPath;
  if(args.length >= 3){
    propertiesPath = args[2];
  }else {
    console.log("No properties path");
    process.exit(1);
  }

  if (propertiesPath.includes("-p")) {
    propertiesPath = propertiesPath.replace("-p","");
  }

  var lines = require('fs').readFileSync(propertiesPath, 'utf-8')
    .split('n')
    .filter(Boolean);

  var map = new Map();
  var tokens,key,value;
  for (var i = 0; i < lines.length; i  ) {
    tokens = lines[i].split("=")
    key   = tokens[0];
    value = tokens[1];
    map.set(key,value);
  }
  var jsonPath = map.get("jsonPath");
  console.log(jsonPath);
}
 

Большое спасибо.