2010-10-14 6 views
4
var http = require("http"); 
var sys = require('sys') 
var filename = process.ARGV[2]; 
var exec = require('child_process').exec; 
var com = exec('uptime'); 


http.createServer(function(req,res){ 
    res.writeHead(200,{"Content-Type": "text/plain"}); 
    com.on("output", function (data) { 
    res.write(data, encoding='utf8'); 
    }); 
}).listen(8000); 
sys.puts('Node server running') 

Comment puis-je transmettre les données au navigateur?Nodejs - Sortie de flux vers le navigateur

Répondre

11

Si vous demandez juste généralement ce qui se passe mal, il y a deux choses principales:

  1. Vous utilisez child_process.exec() mal
  2. Vous n'appelé res.end()

Qu'est-ce que vous êtes la recherche est quelque chose de plus comme ceci:

var http = require("http"); 
var exec = require('child_process').exec; 

http.createServer(function(req, res) { 
    exec('uptime', function(err, stdout, stderr) { 
    if (err) { 
     res.writeHead(500, {"Content-Type": "text/plain"}); 
     res.end(stderr); 
    } 
    else { 
     res.writeHead(200,{"Content-Type": "text/plain"}); 
     res.end(stdout); 
    } 
    }); 
}).listen(8000); 
console.log('Node server running'); 

Notez que cela ne nécessite pas réellement le "streaming" dans le sens où le mot est généralement utilisé. Si vous aviez un long processus d'exécution, de sorte que vous ne vouliez pas mettre en mémoire tampon stdout en mémoire jusqu'à ce qu'il soit terminé (ou si vous envoyiez un fichier au navigateur, etc.), vous voudriez "streamer" la sortie. Vous devez utiliser child_process.spawn pour démarrer le processus, écrire immédiatement les en-têtes HTTP, puis chaque fois qu'un événement 'data' est déclenché sur stdout, vous devez immédiatement écrire les données dans le flux HTTP. Dans un événement 'exit', vous appelez end sur le flux pour le terminer.