2017-08-07 52 views
0

今天我開始學習websockets,因爲我想有一個架構,我可以用它來實時更新。網絡套接字和數據庫更新(推送更改)

我創建了我的第一個websockets node.js和socket.io應用程序,所以我可以通過javascript在客戶端和服務器之間進行通信。這工作正常。

但是我需要一些能夠與MySQL進行通信的東西,因此對於某個表上的每一項更改,都必須告訴客戶端,這是一個變化。

所以我在想,node.js服務器與觀察數據庫的PHP腳本進行通信。但是,我還需要長時間來請求更改,因此無論如何我都可以使用ajax來完成,所以它將毫無用處。

所以我的問題:我怎樣才能實現從數據庫表或某個查詢獲得實時數據更改,這將更新發送到所有客戶端,實時連接,而不需要很長時間輪詢?

謝謝!

+0

你是否設法做到了你想要的? – EMX

回答

3

所以我的問題:我如何才能做到讓從 表的數據庫或從某個查詢實時數據的變化......

有看的MySQL模塊事件:mysql-events

官方示例:

var MySQLEvents = require('mysql-events'); 
var dsn = { 
    host:  _dbhostname_, 
    user:  _dbusername_, 
    password: _dbpassword_, 
}; 
var mysqlEventWatcher = MySQLEvents(dsn); 
var watcher =mysqlEventWatcher.add(
    'myDB.table.field.value', 
    function (oldRow, newRow, event) { 
    //row inserted 
    if (oldRow === null) { 
     //insert code goes here 
    } 

    //row deleted 
    if (newRow === null) { 
     //delete code goes here 
    } 

    //row updated 
    if (oldRow !== null && newRow !== null) { 
     //update code goes here 
    } 

    //detailed event information 
    //console.log(event) 
    }, 
    'match this string or regex' 
); 

...這將發送更新到所有客戶端,實時連接, 沒有長時間輪詢?

您可以使用socket.io,防止初始HTTP輪詢完全由客戶端上這樣做:

var socket = io({transports: ['websocket'], upgrade: false}); 

爲了避免客戶端使用輪詢,該行添加到服務器:

io.set('transports', ['websocket']); 

並將事件從mysql-event發送到所有連接的(socket.io)客戶端使用以下內容:

io.sockets.emit('db-event',eventDataObj)