NodeJS: отправка EOF в поток stdin без закрытия потока

Как я могу сигнализировать EOF потоку без закрытия потока?

У меня есть script, который ждет ввода на stdin, а затем, когда я нажимаю ctrl-d, он выводит вывод на stdout, а затем снова ждет для stdin, пока не нажму ctrl-d.

В моем nodejs script, я хочу, чтобы создать этот script, записать в поток stdin, затем как-то сигнализировать EOF, не закрывая поток. Это не работает:

var http = require('http'),
    spawn = require('child_process').spawn;

var child = spawn('my_child_process');
child.stdout.on('data', function(data) {
    console.log(data.toString());
});

child.stdout.on('close', function() {
    console.log('closed');
})

http.createServer(function (req, res) {
    child.stdin.write('hello child\n');
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

Но если я изменяю child.stdin.write(...) на child.stdin.end(...), он работает, но только один раз; после этого поток закрывается. Я где-то читал, что EOF на самом деле не характер, это просто что-то, что НЕ характер, обычно -1, поэтому я пробовал это, но это тоже не сработало:

var EOF = new Buffer(1); EOF[0] = -1;
child.stdin.write("hello child\n");
child.stdin.write(EOF);

Ответ 1

Вы пробовали child.stdin.write("\x04");? Это код ascii для Ctrl + D.

Ответ 2

Вы сделали это с res только двумя строками ниже...

  • stream.write(data) используется, когда вы хотите продолжить запись
  • stream.end([data]) используется, когда вам не нужно отправлять больше данных (он закроет поток)
var http = require('http'),
    spawn = require('child_process').spawn;

var child = spawn('my_child_process');
child.stdout.on('data', function(data) {
    console.log(data.toString());
});

child.stdout.on('close', function() {
    console.log('closed');
})

http.createServer(function (req, res) {
    child.stdin.end('hello child\n');
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(1337, '127.0.0.1');

Ответ 3

var os = require("os");    
child.stdin.write("hello child\n");
child.stdin.write(os.EOL);

Я использую это в своем проекте и работает