【问题标题】:Node.js spawn process how can i use each line of stdout seperatley to use in functionsNode.js 生成过程我如何使用 stdout seperatley 的每一行在函数中使用
【发布时间】:2014-03-31 19:34:02
【问题描述】:

好的,所以我在下面有我的 nodejs 脚本

var app = require('express')();
var server = require('http').createServer(app);
var bin = "casperjs";
var args = ['Backend.js'];
var io = require('socket.io').listen(server);
server.listen(process.env.PORT);

app.get('/', function (req, res) {
    res.sendfile(__dirname + '/client/index.html');
});

io.sockets.on('connection', function (socket) {
    console.log("socket connection incoming");
});

var spawn = require('child_process').spawn,
child = spawn(bin, args);
child.stdin.setEncoding = 'utf-8';

child.stdout.on('data', function (data) {
    when (data = "Well Hello1") {
        console.log("Working1");
    }
    if (data = "Well Hello2") {
        console.log("Working2");
    }
    if (data = "Well Hello.") {
        console.log("Working");
    }
});

问题是我的 if 语句没有正确处理。

我发现我需要逐行处理标准输出,而不是作为流,任何人都可以向我展示解决方案

【问题讨论】:

  • 你的比较是错误的。我假设你想要if (data == 'Well Hello.')===
  • '=' 工作正常我想要一种改变文本串的方法,这样我就可以逐行阅读它 '==' 似乎不起作用我已经在尝试使用它

标签: javascript node.js spawn


【解决方案1】:

您可能会发现使用event-stream 模块使这变得更容易。

然后你可以这样做:

var es = require('event-stream');

es.pipeline(
    child.stdout,
    es.split(),
    es.map(function (line) {
        if (line === 'Well Hello1') {
            console.log("Working1");
        }
    })
);

您需要先npm install event-stream

这是完整脚本的新版本:

var app = require('express')();
var server = require('http').createServer(app);
var bin = "casperjs";
var args = ['Backend.js'];
var io = require('socket.io').listen(server);
server.listen(process.env.PORT);

app.get('/', function (req, res) {
    res.sendfile(__dirname + '/client/index.html');
});

io.sockets.on('connection', function (socket) {
    console.log("socket connection incoming");
});

var spawn = require('child_process').spawn,
child = spawn(bin, args);
child.stdin.setEncoding = 'utf-8';

var es = require('event-stream');

es.pipeline(
    child.stdout,
    es.split(),
    es.map(function (line) {
        if (line === 'Well Hello1') {
            console.log("Working1");
        }
    })
);

编辑:一个简单的脚本,演示生成/bin/cat,设置管道以拆分然后逐行记录写入的内容,有时还写回child.stdin。如果你运行这个脚本,它会挂起等待cat 的输入,但你会看到输出的内容,你可以轻松地使用它:

var es = require('event-stream');
var spawn = require('child_process').spawn;

var child = spawn('/bin/cat');
var count = 0;

var stream = es.pipeline(
    child.stdout,
    es.split(),
    es.map(function (line) {
        console.log("es.map(" + line + "):");
        if (count < 3) {
            child.stdin.write("Hello(" + count + ")\n");
        }
        count++;
    })
);

child.stdin.write("Testing1\nTesting2");
child.stdin.write("Testing3\nTesting4\n");
child.stdin.write("Testing5\nTesting6\n");

stream.on('data', function (line) {
    console.log(line);
    if (line === '') {
        console.log('end');
        stream.end();
    }
});

【讨论】:

  • 当我出于其他特定原因使用 spawn 时,这是否会与 side spawn 一起工作
  • 如果你能给我看一个使用我的脚本的例子
  • 您仍然需要使用其余代码 - 我只是替换您将处理程序添加到 child.stdout 的最后一位。
  • 完美的唯一问题是我如何在我尝试过的 if 语句中发出 child.stdin.write child.stdin.write("in");但它不起作用
  • 回信到child.stdin是没有问题的。你还没有解释你要做什么,所以我不知道可能出了什么问题。我添加了一个脚本,您可以使用它来尝试更好地理解事物,而无需与 casperjs 交互的复杂性。看看我上面答案末尾的新编辑。
【解决方案2】:

这是一个更简单的例子,用于 ping:

var split = require('split');
var spawn = require('child_process').spawn;

var child = spawn('ping', ['www.google.com']);

child.stdout.pipe(split()).on('data', function (line) {
    console.log('**' + line + '**');
});

【讨论】:

    猜你喜欢
    • 2012-09-28
    • 2014-06-13
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2013-02-26
    • 2015-05-12
    • 2019-09-06
    相关资源
    最近更新 更多