Streaming data with Node.js Streaming data with Node.js ajax ajax

Streaming data with Node.js


It is possible. Just use response.write() multiple times.

var body = ["hello world", "early morning", "richard stallman", "chunky bacon"];// send headersresponse.writeHead(200, {  "Content-Type": "text/plain"});// send data in chunksfor (piece in body) {    response.write(body[piece], "ascii");}// close connectionresponse.end();

You may have to close and reopen connection every 30 seconds or so.

EDIT: this is the code I actually tested:

var sys = require('sys'),http = require('http');http.createServer(function (req, res) {    res.writeHead(200, {'Content-Type': 'text/html'});    var currentTime = new Date();    sys.puts('Starting sending time');    setInterval(function(){        res.write(            currentTime.getHours()            + ':' +            currentTime.getMinutes()            + ':' +            currentTime.getSeconds() + "\n"        );        setTimeout(function() {            res.end();        }, 10000);    },1000);}).listen(8090, '192.168.175.128');

I connected to it by Telnet and its indeed gives out chunked response. But to use it in AJAX browser has to support XHR.readyState = 3 (partial response). Not all browsers support this, as far as I know. So you better use long polling (or Websockets for Chrome/Firefox).

EDIT2: Also, if you use nginx as reverse proxy to Node, it sometimes wants to gather all chunks and send it to user at once. You need to tweak it.


Look at Sockets.io. It provides HTTP/HTTPS streaming and uses various transports to do so:

  • WebSocket
  • WebSocket over Flash (+ XML security policy support)
  • XHR Polling
  • XHR Multipart Streaming
  • Forever Iframe
  • JSONP Polling (for cross domain)

And! It works seamlessly with Node.JS. It's also an NPM package.

https://github.com/LearnBoost/Socket.IO

https://github.com/LearnBoost/Socket.IO-node


You can also abort the infinite loop:

app.get('/sse/events', function(req, res) {    res.header('Content-Type', 'text/event-stream');    var interval_id = setInterval(function() {        res.write("some data");    }, 50);    req.socket.on('close', function() {        clearInterval(interval_id);    }); }); 

This is an example of expressjs. I believe that without expressjs will be something like.