Javascript Node.js spawn进程如何在函数中使用每行stdout separatley
好的,下面是我的nodejs脚本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
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交互的复杂性。看一看我上面答案末尾的新编辑。