2014-01-24 3 views
6

Я пытаюсь это:NodeJS - как получить порожденного ребенка для общения с родителем?

var child = spawn('node', args, {cwd: parentDir, stdio: 'ipc'}); 

(арг представляет собой массив параметров)

, но он дает следующее сообщение об ошибке:

TypeError: Incorrect value of stdio option: ipc

Это на самом деле работает, так что проблема кажется действительно является параметром stdio ipc:

var child = spawn('node', args, {cwd: parentDir}); 

Это также работает:

var child = spawn('node', args, {cwd: parentDir, stdio: 'pipe'}); 

Я прочитал это: http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options , но я не вижу, где я неправильно. Это первый случай, когда я пытаюсь использовать эту функциональность NodeJS, поэтому я сожалею, если проблема очевидна.

Возможно, есть другой способ решить проблему. Ребенок должен быть порожден и не разветвлен, и я просто хочу, чтобы вы могли отправлять сообщения от ребенка родительскому.

спасибо !!

EDIT: У меня есть узел v0.8.18. Я искал историю версий для IPC http://nodejs.org/changelog.html, и нет ничего с поисковым термином «IPC», который заставляет меня думать, что мне нужна более новая версия NodeJS.

+0

Вам нужно указать опцию stdio? – dandavis

+1

Думаю, что так. В противном случае он ничего не делает по умолчанию (из ссылки, помещенной в текст выше). Вот что он говорит о IPC: 'ipc' - Создайте канал IPC для передачи сообщений/файловых дескрипторов между родительским и дочерним. У ChildProcess может быть не более одного дескриптора файла IPC stdio. Установка этой опции позволяет использовать метод ChildProcess.send(). Если ребенок записывает сообщения JSON в этот файловый дескриптор, тогда это вызовет ChildProcess.on ('message'). Если ребенок является программой Node.js, то наличие канала IPC позволит process.send() и process.on ('message'). – rockamic

ответ

0

попробовать:

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: 'ipc'}); 

(добавление кронштейнов к арг, который должен быть массивом) и посмотреть, если это изменяет ваш error-

если не возможно

var child = spawn('node', ['childnodejsscript.js'], {cwd: parentDir, stdio: ['pipe', 1, 2, 'ipc']}); 

И вы можете захотеть изменить 'pipe' или обратиться к stdout также ... не знаете, что вы действительно хотите здесь.

, наконец, это похоже на хороший пост, который поможет вам получить некоторую перспективу. Название не кажется приступе, но если вы читаете то, что происходит в коде, я думаю, что это будет полезно:

http://blog.trevnorris.com/2013/07/child-process-multiple-file-descriptors.html

Не забудьте оставить результаты & помогать другим, что конкретно работал или что вы изменили ... thx

+0

Спасибо, bellasys. Фактически, я изменил исходный код, который я разместил здесь (я упростил его), и вместо того, чтобы помещать фактическую переменную там, которую я использовал, это массив, я ставлю общее имя js, но вы правы. Вот мой фактический код: child [port] = spawn ('node', args, {cwd: parentDir, stdio: 'ipc'}); Я отредактирую оригинальный пост. Благодарю. – rockamic

+0

Я отредактировал свой ответ, предлагая более надежную обработку вашего варианта stdio:. размещение «ipc» в последнем слоте, например. [0,1,2, 'ipc'] по-прежнему получает вас .send() и on ('message') по вашему запросу. Если у вас все еще есть проблемы, скорее всего, ваш контекст для этой строки - проблема, а не сама строка ... FYI Я ссылаюсь на документы для вашей текущей версии Node (0.8.18) и «ipc» * кажется * действительным для вашего version ... – bellasys

+0

Bellasys, я только что видел ваше редактирование и уже несколько минут обходил его. Эта ссылка дала мне представление (чтобы больше взглянуть на FD), и вот что в итоге решило это: child [port] = spawn ('node', args, {cwd: parentDir, stdio: [null, null, null, 'ipc ']}); Так что да, это было действительно полезно. СПАСИБО! Отличный день. – rockamic

3

Rockamic ответил на свой вопрос, основываясь на нескольких моих подталкиваниях. Вот что получилось, почему &:

var child = spawn('node', args, {cwd: parentDir, stdio: [null, null, null, 'ipc']}); 

указания стандартного ввода, стандартный вывод, STDERR, а нуль указывает по умолчанию ...

Если rockamic возвращается и дает свой ответ, я с удовольствием это удалить, чтобы он может получить принятый ответ.

3

Вот полный пример, немного отличается от других ответов:

parent.js

spawn('node', ['child.js'], { 
    stdio: ['inherit', 'inherit', 'inherit', 'ipc'], 
}).on('message', function(data) { 
    console.log(data); 
}); 
  • акции по уходу за детьми же cwd в качестве родителя.
  • inherit используется для совместного использования одних и тех же потоков (например, stdout) с дочерним элементом, поэтому вы можете видеть, например, что-то в консоли.

child.js

process.send && process.send('hello parent'); 
  • Если вы собираетесь использовать один и тот же код непосредственно, то функция будет недоступна (это будет undefined), так что вам нужно сначала проверить.
Смежные вопросы