2013-06-25 11 views
5

Sto tentando di reindirizzare lo stdout & stdin di un child_process in un browser & visualizzarlo in una pagina HTML. Sto usando browserify per far funzionare node.js sul browser. Il mio codice per generare il child_process è come questo.pipe processo figlio stdout e stdin al browser in node.js e browserify

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('=========================='); 
}); 

Ho creato un bundle.js utilizzando browserify e il mio html ha questo aspetto.

<!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> 

Sto cercando di evitare di eseguire un server http e di eseguire il piping dei risultati nel browser. C'è un altro modo in cui posso farlo? Grazie

+0

qual è il problema? Qualche messaggio di errore? –

+0

sì, quindi nel browser process.stdin e process.stdout sono indefiniti che tipo di ha senso dal momento che il browser non dovrebbe supportarlo. Ma non sono sicuro di come aggirarlo – ssarangi

risposta

2

Si dovrebbe esaminare hyperwatch, che reindirizza il lato server stdout/stderr al browser e lo rende esattamente come apparirebbe nel terminale (inclusi i colori).

Se non risolve esattamente il problema, la lettura del codice dovrebbe almeno aiutarti. Utilizza hypernal sotto il cofano per convertire l'output del terminale in html.

+0

grazie amico, molto apprezzato – stringparser

+0

Roba molto bella, con un esempio completo e licenza aperta :) grazie – Andrei

+0

Penso che il modulo NPM frontail possa anche fare la stessa cosa - https: // github.com/mthenw/frontail, l'ho usato e funziona –

1

Non so se questo è troppo tardi, ma sono riuscito a eseguire un programma dal browser a partire da questo codice che funziona solo su Linux (io uso Ubuntu). Dovrai eseguire programmi interattivi con prefisso 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); 
}); 

Un poi farlo funzionare su browser che solo bisogno di aggiungere 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"); 
    }); 

Spero che vi aiuterà.

Problemi correlati