【问题标题】:Node JS live result from MySQLMySQL 的 Node JS 实时结果
【发布时间】:2015-10-03 19:54:50
【问题描述】:

我正在尝试在表格中显示我的数据库中的结果。我希望用户在不刷新页面的情况下实时查看表中所做的每项更改(插入、更新或删除)。

我的第一个问题是如何在这样的表中获取我的数据库数据。我还希望其他用户可以生动地看到用户执行的操作(例如编辑、删除、创建)。

这是我的 server.js

    var io=require('socket.io'), mysql=require('mysql');
    var express = require('express');
    var connection = mysql.createConnection({
       host     : 'localhost',
       user     : 'root',
       password : '',
       database : 'lolast'
   });

   connection.connect(function(err) {
      if(err) {
          console.log('error when connecting to db:', err);
          setTimeout(handleDisconnect, 2000);
      } 
  });

 var ws=io.listen(3000);
 var socketCount = 0
 ws.on('connection', function(socket) {
     socketCount++

     // Let all sockets know how many are connected
    ws.emit('users connected', socketCount);

    socket.on('disconnect', function() {
       // Decrease the socket count on a disconnect, emit
        socketCount--
        ws.emit('users connected', socketCount)
     });
 });

这是我的客户端:

    <script  src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="http://127.0.0.1:3000/socket.io/socket.io.js"></script>
    <script>
    $(document).ready(function(){
       // Connect to our node/websockets server
       var socket = io.connect('http://localhost:3000');

       // New socket connected, display new count on page
       socket.on('users connected', function(data){
          $('#usersConnected').html('Users connected: ' + data)
       })

    })
   </script>
   <div id="usersConnected"></div>

我的用户计数器工作正常,实时显示结果,但我的 sql 数据有问题。

如果有人帮助我,我会非常高兴。

【问题讨论】:

  • MySQL 不会在数据更改时“通知”其他客户端。为此,您要么必须进行一些轮询,并且有办法决定发生了什么变化(可能是某种last_updated 列),要么直接在您的应用程序中创建一些事件系统,其中更新数据库的客户端将触发一个事件来告诉其他人重新加载一些东西。
  • 这是一个相当困难的问题,MySQL 对此并没有开箱即用的支持。我认为 Firebase 擅长于此? Mongo 可能会更好,并且可能还有其他中间件解决方案。自己动手的解决方案是像建议的 jkavalik 一样进行手动轮询。这是扩展的噩梦,如果没有认真的 MySQL 印章,你不会走得太远。

标签: javascript mysql node.js


【解决方案1】:

答案是 mysql 上的复制日志或 bin-logs。看看这个回购:https://github.com/numtel/mysql-live-select

【讨论】:

    【解决方案2】:

    这是一个不完整的答案,但至少可以让您开始解决问题 -

    • MySQL 对此没有任何开箱即用的支持。无论您做什么都需要基于轮询,这并非不可能扩展,但需要非常聪明地使用 MySQL 才能很好地扩展。
    • 为此有更好的存储产品。我认为 Firebase 专门从事这方面的工作(被 Google 收购?),而且我很肯定有一个 AWS 产品可以做到这一点。
    • 甚至像 Redis 这样的 NoSQL 也支持推送。我认为 MongoDB 可以。
    • 可能还有其他中间件解决方案。可能会有框架自己创建和维护表。尝试搜索与语言无关的框架或其他语言的框架,看看是否有什么可以为您指明正确的方向。
    • 自行滚动解决方案将如下所示:您的所有应该对其他用户可见的查询都需要进入表中,或者在表中跟踪,并带有时间戳,您的客户可以查询自从他们上次收到数据以来的任何事情。这很难在不严重影响 MySQL 的情况下进行扩展(但如果您对 MySQL 非常了解,则扩展是合理的)。 (只是根据我在 MySQL 初创公司的经验提出这些说法)。

    【讨论】:

      【解决方案3】:

      我正在使用 firebase 获取实时事件以更改数据库中的值。 对于视图透视,我已将 Firebase 与 Bootstrap 的 DataTable 挂钩。 你可以在这里检查它的小用途。 Firebase 是最好的解决方案之一。 https://www.firebase.com/docs/web/libraries/angular/guide/synchronized-arrays.html

      【讨论】:

        猜你喜欢
        • 2020-06-20
        • 2019-12-24
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        • 1970-01-01
        • 2018-07-09
        • 2018-09-01
        相关资源
        最近更新 更多