我正在尝试管道stdout&将child_process的标准输入到浏览器&在html页面中显示它。我使用browserify来使node.js在浏览器上运行。我生成child_process的代码是这样的。
var child = require('child_process');
var myREPL = child.spawn('myshell.exe', ['args']);
// myREPL.stdout.pipe(process.stdout, { end: false });
process.stdin.resume();
process.stdin.pipe(myREPL.stdin, { end: false });
myREPL.stdin.on('end', function() {
process.stdout.write('REPL stream ended.');
});
myREPL.on('exit', function (code) {
process.exit(code);
});
myREPL.stdout.on('data', function(data) {
console.log('\n\nSTDOUT: \n');
console.log('**************************');
console.log('' + data);
console.log('==========================');
});
我使用browserify创建了一个bundle.js,我的html看起来像这样。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title></title>
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script src="bundle.js"></script>
<script src="main.js"></script>
</head>
<body>
</body>
</html>
我试图避免运行http服务器并在浏览器中将结果传递给它。还有其他方法我可以做到吗? 感谢
答案 0 :(得分:2)
您应该查看hyperwatch,它将服务器端stdout / stderr传送到浏览器,并使其呈现与终端中显示的完全相同(包括颜色)。
如果它没有完全解决您的问题,阅读代码应该至少可以帮助您。它使用引擎盖下的hypernal来将终端输出转换为html。
答案 1 :(得分:1)
我不知道这是否为时已晚但我设法从浏览器运行一个程序,从这个代码开始只适用于linux(我使用ubuntu)。您必须使用stdbuf -o0前缀运行交互式程序。
var child = require('child_process');
var myREPL = child.spawn('bash');
process.stdin.pipe(myREPL.stdin);
myREPL.stdin.on("end", function() {
process.exit(0);
});
myREPL.stdout.on('data', function (data) {
console.log(data+'');
});
myREPL.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
然后要使其在浏览器上工作,您只需要添加socket.io
var myREPL = child.spawn(program);
myREPL.stdin.on("end", function() {
socket.emit('consoleProgramEnded');
});
myREPL.stdout.on('data', function (data) {
socket.emit('consoleWrite',data+'');
});
myREPL.stderr.on('data', function (data) {
socket.emit('consoleWrite',data+'');
});
socket.on('consoleRead',function(message){
console.log("Writing to console:"+message);
myREPL.stdin.write(message.replace("<br>","")+"\n");
});
我希望这会对你有帮助。
答案 2 :(得分:0)