Node.js Socket.io和Express:不断向setInterval方法以外的客户端发送数据

我一直在摆弄socket.io,并expression。 而且,我在这个项目中使用mongoose。 我有这个代码:

服务器

io.on('connection', function (socket) { setInterval(function(){ Data.find({}, {name:1, _id:0}, {sort : { _id : -1 }}, function (err, data) { if (err) { console.log(err); } else { socket.emit('data', {datas: data}); }; }) }, 500); }); 

客户

 var socket = io.connect(); socket.on('data', function (data) { if (data) { $('#names').html(''); $.each(data.datas, function (index, value) { $('#names').append('<li>'+ value.name +'</li>') }) }; }); 

在socket.io连接上执行setInterval以从数据库加载必要的数据连续发送给客户端是否正确? 这会影响服务器的性能吗? 如果是这样,那么从mongodb到客户端的数据持续获取的最好方法是什么? 如果有人从用户/客户端添加数据,有没有办法看(或类似的数据库触发)在MongoDB中的集合? 在我的代码中,我是否正确地将mongodb查询放在setInterval函数中? 我是使用node.js,socket.io和mongodb的新手。 有人能指导我走正确的道路吗? 提前致谢!

也许你最好用像RabbitMQ这样的消息队列解决scheme? 这样,您可以将消息从一个进程发送到另一个进程,并自动通知。 我已经在应用程序中使用Node.js,socket.io和RabbitMQ(如果您感兴趣的区域附近)实现了通知。 这是一个开源项目,我会分享,如果你想(它在GitHub上,但变化尚未合并)。

在任何情况下,在这种情况下,事件总是比轮询更好(如果可能的话)。

这是我所做的,而不是使用setInterval方法,以防有人想知道我在项目中做了些什么。 感谢@Mariusz评论

“如何写一个简单的HTTP Web服务的人写入数据库?”

给了我一个主意。 相反,我所做的是在表单上添加一个事件点击方法,使用socket.emit('client_data', {'data': $(this).serializeArray()}); 将数据发送到服务器。 然后在服务器上调用socket.on('client_data')方法从客户端获取数据以将其保存到数据库,并从callback中调用io.sockets.emit方法,以将更新的数据发送回客户端关于如何向客户发送回复 )。 对不起,如果不能更好地解释它,但这里的代码,所以你可以弄明白。

客户

 <script src="/js/jquery.min.js"></script> <script src="/socket.io/socket.io.js"></script> <form id="form" method="post"> <label for="name">Name: <input id="text"type="text" name="name"></label> <button id="submit" name="submit">save</button> </form> <ul id="names"> {% if datas %} {% for data in datas %} <li>{{data.name}}</li> {% endfor %} {% else %} <li>No data</li> {% endif %} </ul> <script> $(document).ready(function(){ var socket = io.connect(); socket.on('data', function (data) { if (data) { $('#names').html(''); $.each(data.datas, function (index, value) { $('#names').append('<li>'+ value.name +'</li>') }) }; }); $('#form').on('submit', function(e){ e.preventDefault(); socket.emit('client_data', {'data': $(this).serializeArray()}); $('#text').val('').focus(); }) }); </script> 

服务器

 io.on('connection', function (socket) { socket.on('client_data', function(data){ Data.create({ name: data.data[0].value }, function (err, newData) { console.log(newData.name + ' is now saved in the database.') Data.find({}, {name:1, _id:0}, {sort : { _id : -1 }}, function (err, data) { if (err) { console.log(err); } else { io.sockets.emit('data', {datas: data}); }; }) }) }); }); 

现在,每当用户/客户端更新数据时,所有的页面都将被更新,而无需使用setInterval刷新数据。 希望能帮助到你!