【问题标题】:Notifications using Long Polling in node.js mysql and socket io在 node.js mysql 和 socket io 中使用长轮询的通知
【发布时间】:2014-05-24 11:08:33
【问题描述】:

我正在尝试使用 node.js mysql 和 socket.io 为我的站点创建一个通知系统 我想在页面上为登录用户设置一个传入消息计数器。

我只是使用这个查询实现了它:

$result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$MY_ID'");
        $row = $result->fetch_row();
        $totalm = $row[0]; // всего записей
    $result->close();

和输出:

<div class="count"><?=$totalm;?></div>

但这是静态变体,只有在用户更新页面时才会更新。

我想发出实时通知,所以我搬到了 node.js 和 socket.io

现在我有了我的服务器:

var mysql = require('mysql');
var http = require('http');

var connection = mysql.createConnection({
host     : 'localhost',
user     : 'root',
password : '',
database : 'lc'
});

var io = require('socket.io').listen(9000); 

io.set('log level', 3);

io.sockets.on('connection', function (socket) {

    socket.on('addid', function(my_id){

        var sql    = 'SELECT COUNT(*) AS namesCount FROM messages WHERE user_get ' + connection.escape(my_id) + ' ';

    connection.query(sql, function(err, rows) {
        if(rows.length > 0) {


            socket.user = my_id;
            socket.count = rows[0].namesCount;

            console.log(socket.count+' has been logined ');

        } 
    });

        socket.on( 'notif', function(notif) {
        // htmlencode
        notif = escapeHtml(notif); 

        // Unixtime
        milliseconds = parseInt(new Date().getTime()/1000);
        var post  = {user_get: socket.user};
        query = connection.query('SELECT COUNT(*) AS namesCount FROM messages WHERE ?', post, function(err, result) {
        update = connection.query(sql);
        });


        console.log(' usersend id:  ' +socket.user +' ');
         socket.broadcast.to(socket.user).json.emit('incNotif',{'userSend': socket.user, 'notif': socket.count})
        });

    });
});

还有客户:

$(window).load(function() {
var milliseconds = parseInt(new Date().getTime()/1000);
if (navigator.userAgent.toLowerCase().indexOf('chrome') != -1) {
    socket = io.connect('http://localhost:9000', {'transports': ['xhr-polling']});
} else {
    socket = io.connect('http://localhost:9000',);
}

socket.on('connect', function () {

    socket.emit('addid', '<?=$MY_ID;?>'');

    socket.on('incNotif', function (notif) {

        if(msg.userSend == id) {

                $("#mess").append(
                "<div class='count'>"+ notif +"</div>"
                );
                event.preventDefault();
        }

    });

 });

});

没有任何作用。

我对这些技术的了解不够,所以希望你能帮助我。

【问题讨论】:

  • php 代码在 java 中工作,我使用相同的构造 socket.emit('addid', '=$MY_ID;?>'');在我的私人消息系统中

标签: node.js socket.io long-polling


【解决方案1】:
socket = io.connect('http://localhost:9000',); // empty parameter.
socket.emit('addid', '<?=$MY_ID;?>'');  // extra '.

在你的服务器代码中

socket.on( 'notif', function(notif) { 

'notif' 事件不会从客户端发出,因此 'incNotif' 不会被广播。

从mysql读取后广播'incNotif'。

【讨论】:

  • 你能详细解释一下吗
  • 您没有从您的客户端发出 'notif' 事件。所以你的服务器中的 socket.on('notif') 块不会被调用。你已经在这个块中编写了你的​​广播,所以它根本不会发出“incNotif”。
  • 如果移动“socket.broadcast.to(socket.user).json.emit('incNotif',{'userSend': socket.user, 'notif': socket.count})”就在你从 mysql 读取之后。它将发出“incNotif”。然后它将进入客户端的“socket.on('incNotif')”中。使用调试器(firebug 或 chrome 开发者工具)来调试它。您还可以调试 node.js 服务器代码。例如:github.com/node-inspector/node-inspector
  • 我移动了这个“socket.broadcast.to(socket.user).json.emit('incNotif',{'userSend': socket.user, 'notif': socket.count})”从“socket.on('incNotif')”到“socket.on('addid', function(my_id){”,但没有任何反应。它仍然不起作用
猜你喜欢
  • 2016-02-19
  • 2021-11-21
  • 1970-01-01
  • 2013-10-01
  • 2012-06-26
  • 1970-01-01
  • 2018-02-01
  • 2014-01-13
  • 2011-04-12
相关资源
最近更新 更多