繁体   English   中英

Node.js生成过程如何使用stdout seperatley的每一行在函数中使用

[英]Node.js spawn process how can i use each line of stdout seperatley to use in functions

好吧,所以我下面有我的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语句处理不正确。

我已经知道我需要逐行处理stdout,而不是像流一样,任何人都可以给我看一个解决方案。

您可能会发现使用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();
    }
});

这是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 + '**');
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM