如果生成失败,则阻止将数据发送到stdin

时间:2013-09-28 09:43:25

标签: node.js stdin spawn

在我的Node.js(v0.10.9)代码中,我尝试检测2个案例:

  • 安装了一个外部工具(点) - 在这种情况下,我想将一些数据发送到已创建进程的stdin
  • 未安装外部工具 - 在这种情况下,我想显示警告,而我不想发送任何内容来处理'标准输入

我的问题是,当且仅当进程成功生成(即stdin已准备好写入)时,我才知道如何将数据发送到子节点。 如果安装了 dot ,以下代码可以正常工作,但是否则它会尝试向孩子发送数据,尽管孩子没有生成。

var childProcess = require('child_process');

var child = childProcess.spawn('dot');
child.on('error', function (err) {
  console.error('Failed to start child process: ' + err.message);
});
child.stdin.on('error', function(err) {
  console.error('Working with child.stdin failed: ' + err.message);
});

// I want to execute following lines only if child process was spawned correctly
child.stdin.write('data');
child.stdin.end();

我需要这样的东西

child.on('successful_spawn', function () {
  child.stdin.write('data');
  child.stdin.end();
});

2 个答案:

答案 0 :(得分:0)

来自node.js文档:http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

检查失败的exec的示例:

var spawn = require('child_process').spawn,
    child = spawn('bad_command');

child.stderr.setEncoding('utf8');
child.stderr.on('data', function (data) {
  if (/^execvp\(\)/.test(data)) {
    console.log('Failed to start child process.');
  }
});

答案 1 :(得分:0)

看看核心工作者: https://www.npmjs.com/package/core-worker

这个包使得处理过程变得更加容易。 我想你想要做的就是这样(来自文档):

import { process } from "core-worker";

const simpleChat = process("node chat.js", "Chat ready");

setTimeout(() => simpleChat.kill(), 360000); // wait an hour and close the chat

simpleChat.ready(500)
    .then(console.log.bind(console, "You are now able to send messages."))
    .then(::simpleChat.death)
    .then(console.log.bind(console, "Chat closed"))
    .catch(() => /* handle err */);

因此,如果进程未正确启动,则不会执行任何.then语句,这正是您想要做的,对吧?