2015-07-01 172 views
0

我收到從Redis的數據庫更新(消息),我需要顯示在客戶端上進行實時的消息,爲此我使用SSE(服務器發送事件)。服務器發送活動

所以,我的代碼如下所示:

客戶端的JavaScript:

var source = new EventSource('/updates'); 

source.addEventListener('pmessage', function(e) { 
    console.log('Event: ' + e.event); 
    console.log('Data: ' + e.data); 
}, false); 

服務器端(節點+快遞):

req.socket.setTimeout(Infinity); 

    var redisURL = url.parse(process.env.REDISCLOUD_URL); 
    var client = redis.createClient(redisURL.port, redisURL.hostname, {ignore_subscribe_messages: true}); 
    client.auth(redisURL.auth.split(":")[1]); 

    client.psubscribe('updates'); 

    client.on('error', function (err) { 
    console.log('Error: ' + err); 
    }); 

    client.on('psubscribe', function (pattern, count) { 
    console.log('psubscribe pattern: ' + pattern); 
    console.log('psubscribe count: ' + count); 
    }); 

    client.on('pmessage', function (pattern, channel, message) { 
    console.log('pmessage pattern: ' + pattern); 
    console.log('pmessage from channel: ' + channel); 
    console.log('pmessage message: ' + message); 
    res.write("data: " + message + '\n\n'); 
    }); 

    res.writeHead(200, { 
    'Content-Type': 'text/event-stream', 
    'Cache-Control': 'no-cache', 
    'Connection': 'keep-alive' 
    }); 
    res.write('\n'); 

我沒有收到來自任何更新服務器連接到客戶端(服務器從redis正確接收消息)。

如果我刷新服務器我收到此錯誤:網:: ERR_INCOMPLETE_CHUNKED_ENCODING

我新的SSE,所以也許我做錯了。我希望在你的幫助下。

回答

1

解決的辦法是每次你需要將消息發送到客戶端,在我的情況時寫res.flush()

client.on('pmessage', function (pattern, channel, message) { 
    console.log('pmessage pattern: ' + pattern); 
    console.log('pmessage from channel: ' + channel); 
    console.log('pmessage message: ' + message); 
    res.write("data: " + message + '\n\n'); 
    res.flush(); 
    }); 

解決。

+0

哇,它的工作原理!我有一個小問題:'res.flush()'做了什麼?當我在'localhost'上運行客戶端和服務器時,我的SSE工作,但是當我在不同的域上運行它們時(例如,'localhost'上的客戶端向遠程API服務器發送請求),會發生此錯誤。 'res.flush()似乎不在'express'的API中。 –