Node JS实时显示MySQL查询结果

3
我正在尝试在表格中展示我的数据库结果。我希望用户能够实时看到表格中所做的每个更改(插入、更新或删除),而无需刷新页面。
我的第一个问题是如何以这种方式获取我的数据库数据。我还希望用户采取的操作能够实时地被其他用户看到(例如编辑、删除、创建)。

enter image description here

这是我的 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数据出现了问题。如果有人能帮忙,我将非常感激。

1
MySQL在数据更改时不会“通知”其他客户端。为此,您必须进行一些轮询并有手段来决定发生了什么更改(可能是某种“last_updated”列),或者直接在应用程序中创建一些事件系统,在其中更新数据库的客户端将触发一个事件以告诉其他人重新加载某些内容。 - jkavalik
这是一个相当棘手的问题,MySQL并没有针对此提供开箱即用的支持。我认为Firebase专门从事这方面的工作?Mongo可能更好一些,还有其他中间件解决方案。自己编写的解决方案是像jkavalik建议的那样进行手动轮询。这在扩展方面是一场噩梦,如果没有严谨的MySQL技能,你将无法走得太远。 - djechlin
3个回答

2

1

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

  • MySQL没有任何开箱即用的支持。你所做的任何事情都需要基于轮询,这并不是不可能扩展,但需要非常聪明地使用MySQL才能很好地扩展。
  • 有更好的存储产品可供选择。我认为Firebase专门从事此项工作(被Google收购?),我确定AWS也有类似的产品。
  • 即使像Redis这样的NoSQL也具有推送支持。我认为MongoDB也有。
  • 可能还有其他中间件解决方案。可能会有框架自动创建和维护表。尝试搜索与语言无关的框架或其他语言的框架,看看是否有任何指向正确方向的东西。
  • 自己制定的解决方案将类似于:所有应该对其他用户可见的查询都需要进入表格,或者在表格中进行跟踪,并带有时间戳,以便您的客户端可以查询自上次接收数据以来的任何内容。这很难扩展,需要严肃的MySQL技能(但如果您熟悉MySQL,则可以合理扩展)。 (只是根据我在一个MySQL创业公司的经验提出这些声明)。

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接