websockets 和数据库更新(推送更改)

Posted

技术标签:

【中文标题】websockets 和数据库更新(推送更改)【英文标题】:websockets and database updates (push on change) 【发布时间】:2018-01-14 22:51:51 【问题描述】:

我今天开始学习websockets,因为我想有一个架构,我可以得到实时更新。

我创建了我的第一个 websockets node.js 和 socket.io 应用程序,因此我可以通过 javascript 在客户端和服务器之间进行通信。效果很好。

但我需要一些可以与 MySQL 通信的东西,这样对于某个表上的每一次更改,它都必须告诉客户端发生了更改。

所以我认为 node.js 服务器与观察数据库的 php 脚本通信。但是我还需要长拉来请求更改,所以无论如何我都可以使用 ajax 来完成,所以它没有用。

所以我的问题是:如何从数据库表或某个查询中获取实时数据更改,这会将更新发送到所有实时连接的客户端,而无需长时间轮询?

谢谢!

【问题讨论】:

你做到了吗? 【参考方案1】:

所以我的问题是:如何从 数据库的表或来自某个查询...

有一个模块可以监视 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)

【讨论】:

以上是关于websockets 和数据库更新(推送更改)的主要内容,如果未能解决你的问题,请参考以下文章

从服务器推送websocket数据后Angularjs模型发生变化

结合 websockets 和 http

播放 WebSockets 服务器推送示例

websocket实现GPS数据的实施推送与地图的展示

websocket实现GPS数据的实施推送与地图的展示

WebSocket实现数据库更新前台实时显示