我有一个node.js服务器,可以管理用户列表。创建新用户时,所有客户端应在列表中立即显示添加的用户。
我知道如何无需请求将数据发送给客户端 - 使用WebSocket,但是在此实现中,不允许Websocket。
当服务器中添加新用户时,是否可以在不使用WebSocket的情况下更新所有客户端的用户列表?
// Client side
const subscribe = function(callback) {
var longPoll = function() {
$.ajax({
method: 'GET',
url: '/messages',
success: function(data) {
callback(data)
},
complete: function() {
longPoll()
},
timeout: 30000
})
}
longPoll()
}
// Server Side
router.get('/messages', function(req, res) {
var addMessageListener = function(res) {
messageBus.once('message', function(data) {
res.json(data)
})
}
addMessageListener(res)
})
长时间的轮询是客户端从服务器请求新数据的地方,但是在有数据之前,服务器不会响应。同时,客户端与服务器有开放的连接,并且一旦服务器准备好发送了新数据。
参考:http://hungtran.co/long-polling-and-websockets-on-nodejs/
有第三种方法:推送通知
您的应用程序应在推送通知服务器(公共或专有(中注册,然后您的服务器将能够异步发送消息
您可以使用带有诸如sse-express
的实现的服务器式事件:
// client
let eventSource = new EventSource('http://localhost:80/updates');
eventSource.addEventListener('connected', (e) => {
console.log(e.data.welcomeMsg);
// => Hello world!
});
// server
let sseExpress = require('./sse-express');
// ...
app.get('/updates', sseExpress, function(req, res) {
res.sse('connected', {
welcomeMsg: 'Hello world!'
});
});