在Node.js和Browserify中将子进程的标准输出和标准输入导向浏览器

5

我正在尝试将child_process的stdout和stdin导向浏览器,将其显示在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服务器并将结果传输到它。是否有其他方式可以做到这一点?谢谢


有什么问题吗?有出现错误信息吗? - Jeremiah Orr
是的,在浏览器中,process.stdin和process.stdout是未定义的,这在某种程度上是有道理的,因为不希望浏览器支持它。但我不确定如何解决这个问题。 - ssarangi
3个回答

4
你应该看一下hyperwatch,它可以将服务器端的stdout/stderr传输到浏览器,并像在终端中一样呈现它(包括颜色)。
如果它不能完全解决你的问题,阅读代码至少会有所帮助。它在内部使用hypernal将终端输出转换为html。

非常棒的东西,有完整的示例和开放式许可证 :) 谢谢 - Andrei
我认为frontail NPM模块也可以做同样的事情 - https://github.com/mthenw/frontail,我已经使用过它并且它有效。 - Alexander Mills
"hypernal"非常好用!这是我找到的唯一一个专门用于渲染输出(而不是模拟实际终端)并且很好地支持颜色等转义码以及控制码,如光标移动。大多数解决方案在这一点上都表现得很糟糕。 - Aaron Beall

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");
    });

我希望那能对您有所帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接