LINUX.ORG.RU

Прочесть всё содержимое stdin

 ,


0

1

read.js:

require('fs').readFileSync('/dev/stdin', 'utf-8');


spawn.js:

let {spawnSync} = require('child_process');
for (let i=0; i<1000; i++) {
    let result = spawnSync('node', ['read.js'], {input:'SOME DATA'});
    if (result.status) {
        console.log(result.stderr.toString());
        break;
    }
}


Запуск node spawn.js выдаёт:

Error: ENXIO: no such device or address, open '/dev/stdin'
    at Object.fs.openSync (fs.js:651:18)
    at Object.fs.readFileSync (fs.js:553:33)
    at Object.<anonymous> (/home/ras/jstest/read.js:1:77)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Function.Module.runMain (module.js:605:10)
    at startup (bootstrap_node.js:158:16)


ШЗН? Гугл говорит, что проблема известна, но решать её не собираются.

Как в node.js прочесть всё содержимое stdin?

Ответ на: комментарий от Vit

Как бы ещё всю эту дьявольскую асинхронщину сделать синхронной?

Вот так не работает:

async function readStdin() {
	let stdin = new Promise(resolve => {
		let chunks = [];
		process.stdin.on('data', data => {
			chunks.push(data);
		});
		process.stdin.on('end', () => {
			console.log('end of stdin');
			resolve(Buffer.concat(chunks).toString());
		});
	});
	await stdin;
	return stdin;
}

let stdin = readStdin();
console.log('readStdin returned');
console.log(stdin.length);
kinkstarter
() автор топика
Ответ на: комментарий от kinkstarter

Как бы ещё всю эту дьявольскую асинхронщину сделать синхронной?

Полностью - никак. Ты наверное как-то так хотел:

async function readStdin() {
  let stdin = await new Promise((resolve, reject) => {
    let chunks = [];
    
    process.stdin.on('data', data => chunks.push(data));

    process.stdin.on('error', err => reject(err));

    process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString()));
  });

  console.log(`readStdin returned ${stdin.length} chars`);
}

readStdin();

?

Погугли еще «stackoverflow process.stdin».

Vit ★★★★★
()
Ответ на: комментарий от anonymous

По обстоятельствам. Вообще *Sync методы сделали для всего апи, и шеловские скрипты теперь писать не так гиморно как раньше. Просто ты в очень специфичную область ломанулся.

Загугли «process.stdin sync read», там вроде были какие-то хаки, но я не проверял.

Ну либо смирись, что твой код надо обернуть в async function () {} и юзать await внутри. Обычно это приемлимо - читаемость на уровне синхронного кода.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Но readStdin не блокируется, выполнение продолжается сразу дальше! А если я в цикле это делаю и не хочу начинать следующую итерацию, пока не выполнится эта? Как такое принято делать в ноде?

На мой скромный мозг эта вся асинхронщина с трудом налазит.

anonymous
()
Ответ на: комментарий от anonymous

Блин, фигню спорол. Цикл у меня в другом скрипте.

anonymous
()
Ответ на: комментарий от anonymous

У меня сложилось впечатление, что ты с какого-то другого языка пришел и просто еще не освоился.

Почитай обучалки по async/await. Они специально придуманы, чтобы асинхронность мозг не взрывала.

Vit ★★★★★
()
Ответ на: комментарий от Vit

У меня сложилось впечатление, что ты с какого-то другого языка пришел и просто еще не освоился.

Точно так.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.