我一直在摆弄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的新手。有人可以指引我走正确的道路吗?提前谢谢!
答案 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上,但是还没有合并)。
在任何情况下,在这种情况下,事件总是比轮询更好(如果可能的话)。