首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用节点js和socket.io在mysql数据库中插入新记录时通知和更新客户端。

如何使用节点js和socket.io在mysql数据库中插入新记录时通知和更新客户端。
EN

Stack Overflow用户
提问于 2019-02-05 15:00:02
回答 1查看 1.2K关注 0票数 2

无法使用mysql节点js和socket.io更新客户端中的记录列表

大家好,我想更新客户端时,新的记录是插入到mysql数据库,即时通讯使用节点js和socket.io。

我能做些什么来解决这个问题呢?我是node和socket的新手,如果我的代码太混乱,请原谅。我找了很久,但什么也没找到。任何建议都会有帮助。这是我的server.js文件:

代码语言:javascript
复制
    var mysql = require('mysql') ;
var io = require('socket.io').listen(3000) ;

var db = mysql.createConnection({
    host:'localhost',
    user:'root',
    database:'mygame'
});

db.connect(function(err){
    if(err) console.log(err);
    console.log("Connected Successfully To The Database");
});

// Here We Need List Of Competitions To Emit To All Clients 

var Competitions = [] ;
var isInitCompetitions = false ;
var socketCount = 0 ;

//
io.sockets.on('connection',function(socket){
    Competitions = [];
    db.query("SELECT * FROM comps WHERE compstatus='1'").on(
        'result',function(data) {

            Competitions.push(data) ;
        }
    ).on(
        'end',function(){
            socket.emit('all competitions',Competitions);
        }
    ) ;
    socketCount++ ;
    io.sockets.emit('Another User Is Connected : ' ,socketCount);
    console.log('One User Is Connected');
    socket.on('disconnect',function() {
        io.sockets.emit('One User Left : ' ,socketCount);
    });

    function checkNewCompetitions() {
        socket.on('newcomp',function(){
            db.query("SELECT * FROM comps WHERE compstatus='1'").on(
                'result',function(data) {
                    Competitions = [];
                    Competitions.push(data) ; 
                }
            ).on(
                'end',function(){
                    socket.emit('all competitions',Competitions);
                    console.log('Number Of Competitions in Flow : ' , Competitions.length) ;
                }
            ) ;
        });
    }
    setInterval(checkNewCompetitions,3000);



});

下面是我的index.html文件:

代码语言:javascript
复制
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script>
    $(document).ready(function() {
        var socket = io.connect('http://localhost:3000');
        socket.on('all competitions',function(data) {
           var html = ''  ;
           for(var i = 0 ;i < data.length; i++){
               html += '<li>'+data[i].id + '</li>';
           }
           $('#competitions').html(html);
        });
        socket.on('newcomp',function(data) {
           var html = ''  ;
           for (let index = 0; index < data.length; index++) {
               const element = data[index];
               html += '<li>' + data[index].id + '</li>';
           }
           $('#competitions').html(html);
        });
    });
</script>
<p>This is List Of Competitions</p>
<ul id="competitions"></ul>

我运行了这段代码,但是我得到了这个错误:

代码语言:javascript
复制
(node:8628) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 newcomp listeners added. Use emitter.setMaxListeners() to increase limit

感谢这个伟大的社区,我能为这个问题做些什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-05 15:11:04

每隔3秒添加一个新的事件侦听器,这样就会发生MaxListenersExceededWarning。每隔3秒调用一次checkNewCompitions就可以了。如果有一个新的comp,你必须用socket.emit(' newComp ')发出一个newcomp事件

代码语言:javascript
复制
    socketCount++ ;
    io.sockets.emit('Another User Is Connected : ' ,socketCount);
    console.log('One User Is Connected');
    socket.on('disconnect',function() {
        io.sockets.emit('One User Left : ' ,socketCount);
    });

    function checkNewCompetitions() {
/// Every 3 seconds you check the database for new comps
            db.query("SELECT * FROM comps WHERE compstatus='1'").on(
                'result',function(data) {
                    Competitions = [];
                    Competitions.push(data) ; 
                }
            ).on(
                'end',function(){

// here you have to call socket.emit('newComp') 
// so the client gets the event a new comp is inserted in database. 

                    socket.emit('all competitions',Competitions);
                    console.log('Number Of Competitions in Flow : ' , Competitions.length) ;
                }
            ) ;

    }
    setInterval(checkNewCompetitions,3000);

});

我找不到你在哪里发出了'newcomp‘事件。所以socket.on('newcomp'..)永远不会被呼叫

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54529181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档