使用Nodejs實現即時推送MySQL資料庫最新資訊到用戶端

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   strong   

下面我們要做的就是把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="socket.io/socket.io.js"></script>    <script src="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下載


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.