【问题标题】:pipe child process stdout & stdin to browser in node.js & browserify在 node.js 和 browserify 中通过管道子进程 stdout 和 stdin 到浏览器
【发布时间】:2013-06-25 22:30:48
【问题描述】:

我正在尝试将 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 服务器并将结果传送给它。还有其他方法可以做到吗? 谢谢

【问题讨论】:

  • 有什么问题?有任何错误消息吗?
  • 是的,所以在浏览器中 process.stdin 和 process.stdout 是未定义的,因为不希望浏览器支持它。但我不确定如何解决它

标签: node.js browserify node.js-client


【解决方案1】:

您应该查看hyperwatch,它将服务器端 stdout/stderr 通过管道传输到浏览器,并将其呈现为与终端中显示的完全一样(包括颜色)。

如果它不能完全解决您的问题,通读代码至少应该对您有所帮助。它在后台使用hypernal 将终端输出转换为html。

【讨论】:

  • 非常好的东西,有一个完整的例子和开放的许可证:) 谢谢你
  • 我认为frontail NPM模块也可以做同样的事情-github.com/mthenw/frontail,我用过它,它可以工作
  • hypernal 效果很好!这是我发现的唯一一个纯粹用于渲染输出(不模拟实际终端)的库,并且在支持转义码(如颜色)以及控制码(如光标移动)方面做得很好。大多数解决方案在这一点上都失败了。
【解决方案2】:

我不知道这是否为时已晚,但我设法从浏览器运行了一个程序,该程序从此代码开始,仅适用于 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");
    });

希望对你有帮助。

【讨论】:

    【解决方案3】:

    我觉得frontail NPM模块也可以做你想做的——

    https://github.com/mthenw/frontail

    我用过,效果很好

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2011-05-05
      • 1970-01-01
      • 2017-02-01
      • 2014-02-14
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多