Nodejs — Stream output to browser


var http = require("http");
var sys = require('sys')
var filename = process.ARGV[2];
var exec = require('child_process').exec;
var com = exec('uptime');

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

How do I get the data streamed to the browser ?

Problem courtesy of: Harry


If you’re just generally asking whats going wrong, there are two main things:

  1. You’re using child_process.exec() incorrectly
  2. You never called res.end()

What you’re looking for is something more like this:

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"});
else {
res.writeHead(200,{"Content-Type": "text/plain"});
console.log('Node server running');

Note that this doesn’t actually require ‘streaming’ in the sense that the word is generally used. If you had a long running process, such that you didn’t want to buffer stdout in memory until it completed (or if you were sending a file to the browser, etc), then you would want to ‘stream’ the output. You would use child_process.spawn to start the process, immediately write the HTTP headers, then whenever a ‘data’ event fired on stdout you would immediately write the data to HTTP stream. On an ‘exit’ event you would call end on the stream to terminate it.

Solution courtesy of: russell_h

View additional discussion.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.