Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js spawn进程如何在函数中使用每行stdout separatley_Javascript_Node.js_Spawn - Fatal编程技术网

Javascript Node.js spawn进程如何在函数中使用每行stdout separatley

Javascript Node.js spawn进程如何在函数中使用每行stdout separatley,javascript,node.js,spawn,Javascript,Node.js,Spawn,好的,下面是我的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 (r

好的,下面是我的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,而不是作为一个流,任何人都可以向我展示一个解决方案。请

您可能会发现,使用
事件流
模块会使这更容易

然后,您可以执行以下操作:

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

es.pipeline(
    child.stdout,
    es.split(),
    es.map(function (line) {
        if (line === 'Well Hello1') {
            console.log("Working1");
        }
    })
);
您首先需要
npm安装事件流

以下是完整脚本的新版本:

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();
    }
});
var es=require('event-stream');
var spawn=require('child_process')。spawn;
var child=spawn('/bin/cat');
var计数=0;
var stream=es.pipeline(
child.stdout,
es.split(),
es.地图(功能(行){
console.log(“es.map(“+line+”)”);
如果(计数<3){
编写(“Hello(“+count+”)\n”);
}
计数++;
})
);
child.stdin.write(“Testing1\nTesting2”);
child.stdin.write(“Testing3\nTesting4\n”);
child.stdin.write(“Testing5\nTesting6\n”);
stream.on('data',函数(行){
控制台日志(行);
如果(行==''){
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 + '**');
});

你的比较是错误的。我假设您想要
if(data==“Well Hello.”)
==
“==”很好,我想要一种改变文本流的方法,这样我就可以逐行阅读它了“==”似乎不起作用,我已经在尝试使用它了,这会像我在其他规范中使用spawn一样起作用吗?我的理由是,如果你能给我一个升级脚本的例子,你仍然需要使用其余的您的代码-我只是在替换最后一位,您将处理程序添加到
child.stdout
。完美的唯一问题是如何在我尝试的if stations child.stdin.write(“in”)中发出child.stdin.write;但是它不起作用写回
child.stdin
没有问题。你还没有解释你想做什么,所以我不知道会出什么问题。我添加了一个脚本,您可以使用它来更好地理解事情,而不必担心与casperjs交互的复杂性。看一看我上面答案末尾的新编辑。