首页 > 代码库 > 使用Nodejs实现实时推送MySQL数据库最新信息到客户端

使用Nodejs实现实时推送MySQL数据库最新信息到客户端

下面我们要做的就是把MySQL这边一张表数据的更新实时的推送到客户端,比如MySQL这边表的数据abc变成123了,那使用程序就会把最新的123推送到每一个连接到服务器的客户端。如果服务器的连接的客户端为0,也就是这时候没有客户端连接,那程序也不会执行推送信息的代码以免产生不必要的资源消耗,当有客户端连上的时候又开始推送。demo的代码大家可以到下面的Download按钮去下载。
 
要运行首先我们要安装nodejs要用到的mysql模块:
$ npm install mysql

更多关于mysql模块的使用请访问:https://github.com/felixge/node-mysql

再安装Socket.io模块:

$ npm install socket.io
更多关于socket.io模块的使用请访问:http://socket.io/
 
新建数据库nodejs,表articles(也可以把表建在你现有的的数据库上,修改一下相应的源代码):
CREATE DATABASE `nodejs`CHARACTER SET utf8 ;USE `nodejs`;SHOW DATABASES;USE `nodejs`;CREATE TABLE `nodejs`.`articles`(`title` TEXT , `author` TEXT ,`description` TEXT);

进入nodejs-push-MySQL目录运行demo:

$ node server.js
测试效果:
  • 打开浏览器输入http://localhost:8080 (可以多开几个,明显能感觉到实时的推送效果)
  • 使用MySQL工具登录到MySQL数据库,修改数据库nodejs里面articles表的数据
  • 一旦表数据被保存,那些打开的客户端将收到最新的更改
  • client.html源代码:
<html>    <head>      <title>使用Nodejs实现实时推送MySQL数据库最新信息到客户端</title>    <style>        dd,dt {            float:left;            margin:0;            padding:5px;            clear:both;            display:block;            width:100%;            }            dt {            background:#ddd;            }            time {            color:gray;            }        </style>    </head>    <body>        <time></time>        <div id="container">Loading ...</div>    <script src=http://www.mamicode.com/"socket.io/socket.io.js"></script>    <script src=http://www.mamicode.com/"http://code.jquery.com/jquery-latest.min.js"></script>    <script>        // 创建websocket连接        var socket = io.connect(http://localhost:8080);        // 把信息显示到div上        socket.on(notification, function (data) {        var articlesList = "<dl>";        $.each(data.articles,function(index,article){            articlesList += "<dt>" + article.title + "</dt>\n" +                         "<dd>" + article.author + "\n" +                         "<dd>" + article.description + "\n"                         "</dd>";        });        articlesList += "</dl>";        $(#container).html(articlesList);           $(time).html(最后更新时间: + data.time);      });    </script>    </body></html>
//建立MySQL连接, 根据自己环境修改相应的数据库信息var app = require(‘http‘).createServer(handler),  io = require(‘socket.io‘).listen(app),  fs = require(‘fs‘),  mysql = require(‘mysql‘),  connectionsArray = [],  connection = mysql.createConnection({    host: ‘localhost‘,    user: ‘root‘,    password: ‘root‘,    database: ‘nodejs‘,    port: 3306  }),  POLLING_INTERVAL = 1000,  pollingTimer;// 检查数据库连接是否正常connection.connect(function(err) {  // 不出现错误信息,那表示数据库连接成功  console.log(err);});//启动HTTP服务,绑定端口8080app.listen(8080);// 加载客户端首页function handler(req, res) {  fs.readFile(__dirname + ‘/client.html‘, function(err, data) {    if (err) {      console.log(err);      res.writeHead(500);      return res.end(‘加载客户端首页发生错误...‘);    }    res.writeHead(200);    res.end(data);  });}/* * 这个就是实现主要功能的方法,间隔3秒去查询数据库表,有更新就推送给客户端 */var pollingLoop = function() {  // 查询数据库  var query = connection.query(‘SELECT * FROM articles‘),    articles = []; // 用于保存查询结果  // 查询结果监听  query    .on(‘error‘, function(err) {      // 查询出错处理      console.log(err);      updateSockets(err);    })    .on(‘result‘, function(user) {      // 加入查询到的结果到articles数组      articles.push(user);    })    .on(‘end‘, function() {      // 检查是否有客户端连接,有连接就继续查询数据库      if (connectionsArray.length) {        pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);        updateSockets({          articles: articles        });      }    });};// 创建一个websocket连接,实时更新数据io.sockets.on(‘connection‘, function(socket) {  console.log(‘当前连接客户端数量:‘ + connectionsArray.length);  // 有客户端连接的时候才去查询,不然都是浪费资源  if (!connectionsArray.length) {    pollingLoop();  }  socket.on(‘disconnect‘, function() {    var socketIndex = connectionsArray.indexOf(socket);    console.log(‘socket = ‘ + socketIndex + ‘ disconnected‘);    if (socketIndex >= 0) {      connectionsArray.splice(socketIndex, 1);    }  });  console.log(‘有新的客户端连接!‘);  connectionsArray.push(socket);});var updateSockets = function(data) {  // 加上最新的更新时间  data.time = new Date();  // 推送最新的更新信息到所以连接到服务器的客户端  connectionsArray.forEach(function(tmpSocket) {    tmpSocket.volatile.emit(‘notification‘, data);  });};

 demo下载