Node.js Socket.io和Express:连续向客户端发送数据而不是setInterval方法

时间:2014-05-03 08:49:31

标签: node.js express socket.io

我一直在摆弄socket.io并表达。我在这个项目中使用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的新手。有人可以指引我走正确的道路吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

这是我完成的,而不是使用setInterval方法,以防有人想知道我是如何在我的项目上做到的。感谢@Mariusz评论

  

&#34;写入的人调用的简单HTTP Web服务怎么样?   数据库?&#34;

给了我一个主意。相反,我所做的是在表单提交时使用socket.emit('client_data', {'data': $(this).serializeArray()});添加事件点击方法,以将数据发送到服务器。然后在服务器上我调用socket.on(&#39; client_data&#39;)方法从客户端获取数据以将其保存到数据库并从回调调用io.sockets.emit方法以发回更新的数据到客户端(reference on how to send responses to clients)。很抱歉,如果无法解释它更好,但这里有代码,所以你可以搞清楚。

<强>客户端

<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来刷新数据。 希望它有所帮助!

答案 1 :(得分:1)

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

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