#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);
}
Большое спасибо.