使用stream式JSON输出构build简单的nodejs API

我正在尝试构build一个简单的基于node.js的streamAPI。 所有我想要做的是当我打到服务器的url,输出应该串stream一组testing数据(JSON)像Twitterstream媒体API。

var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); server.listen(8083); app.get('/', function (req, res) { res.write(io.on('connection', function (socket) { socket.emit('item', { hello: 'world' }); })); }); 

所以,如果我curl http://localhost:8083/ ,我想要输出如下所示:

 $ curl http://localhost:8083/ {hello: 'world'} {hello: 'world'} {hello: 'world'} {hello: 'world'} ... 

我是新的node.js和networking套接字。 关于节点如何工作的基础知识,我可能是非常错误的,让我知道最好的解决scheme。

首先,最好将JSONStream部分放在中间件中,如下所示:

 var _ = require('lodash'); // https://github.com/smurthas/Express-JSONStream/blob/master/index.js function jsonStream(bytes) { return function jsonStream(req, res, next) { // for pushing out jsonstream data via a GET request var first = true; var noop = function () {}; res.jsonStream = function (object, f) { f = _.isFunction(f) ? f : noop; if (!(object && object instanceof Object)) { return f(); } try { if (first) { first = false; res.writeHead(200, { 'Content-Type': 'application/json', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); } res.write(JSON.stringify(object) + '\n'); } catch (err) { return _.defer(f.bind(null, err)); } f(); }; next(); }; } 

然后,假设您希望每次有人连接到socket.io时都通过此API进行通知

 var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); var _ = require('lodash'); var EventEmitter = require('events').EventEmitter; server.listen(8083); var mediator = new EventEmitter(); io.on('connection', function (socket) { mediator.emit('io:connection:new', socket); }); // the second parameter, specify an array of middleware, // here we use our previously defined jsonStream app.get('/', [jsonStream()], function (req, res) { function onNewConnection(socket) { res.jsonStream({ type: 'newConnection', message: 'got a new connection', socket: { id: socket.id } }); } // bind `onNewConnection` on the mediator, we have to use an mediator gateway // because socket.io does not offer a nice implementation of "removeListener" in 1.1.0 // this way each time someone will connect to socket.io // the current route will add an entry in the stream mediator.on('io:connection:new', onNewConnection); // unbind `onNewConnection` from the mediator // when the user disconnects req.on('close', function () { mediator.removeListener('connection', onNewConnection); }); res.jsonStream({ type: 'welcome', message: 'waiting for connection' }); }); 

最后,如果你想testing这个代码,而不连接到socket.io使用下面的模拟器:

 // Simulate socket.io connections using mediator (function simulate() { var dummySocket = { id: ~~(Math.random() * 1000) }; mediator.emit('io:connection:new', dummySocket); setTimeout(simulate, Math.random() * 1000); })();