如何使用socket.io和sql知道某人是否在我的网站上在线

时间:2019-05-29 14:04:20

标签: javascript node.js socket.io

我正在尝试创建一个可以在有人在线访问我的网站以及更改页面时更改我的数据库值的系统。

出于资源原因,我不会使用AJAX。

我在服务器上使用socket.io,但是由于socket.on('disconnect)似乎随机运行,所以我被卡住了

在我的网站上,我刚刚编写了一个将网站连接到服务器的功能,其余的工作由服务器完成。

index.js

// userId = 1;
function userIsOnline(userId) {
      var socket = io.connect('MY_SERVER', { query: "data=" + userId });  
}

server.js

var fs = require('fs');

var mysql = require('mysql')

var db = mysql.createConnection({
    host: 'MY_HOST',
    user: 'MY_USER',
    password: 'MY_PASSWORD'
 });

db.connect(function(err){
if (err) throw err;
    console.log("Connected !");
});

var app = require('http').createServer(function(request, response) {
    response.writeHead(200, {
        'Content-Type': 'text/html'
    });
    response.write('<h1>Serveur Node.JS</h1>');
    response.end();
});


// socket.io goes below

var io = require('socket.io').listen(app, {
    log: true,
    origins: '*:*'
});

io.set('transports', [
    // 'websocket',
    'xhr-polling',
    'jsonp-polling'
]);

var channels = {};

io.sockets.on('connection', function (socket) {
    var userId = socket.handshake.query['data'];


db.query("UPDATE all.serviceworker_subscriptions SET isOnline = 'O' WHERE userId = '"+userId+"'");
    var initiatorChannel = '';
    if (!io.isConnected) {
        io.isConnected = true;
    }

    socket.on('new-channel', function (data) {
        if (!channels[data.channel]) {
            initiatorChannel = data.channel;
        }

        channels[data.channel] = data.channel;
        onNewNamespace(data.channel, data.sender);
    });

    socket.on('presence', function (channel) {
        var isChannelPresent = !! channels[channel];
        socket.emit('presence', isChannelPresent);
    });

    socket.on('disconnect', function (channel) {

    db.query("UPDATE all.serviceworker_subscriptions SET isOnline = 'N' WHERE userId = '"+userId+"'");
        if (initiatorChannel) {
            delete channels[initiatorChannel];
        }
    });
});

function onNewNamespace(channel, sender) {
    io.of('/' + channel).on('connection', function (socket) {
        var username;
        if (io.isConnected) {
            io.isConnected = false;
            socket.emit('connect', true);
        }

        socket.on('message', function (data) {
            if (data.sender == sender) {
                if(!username) username = data.data.sender;

                socket.broadcast.emit('message', data.data);
            }
        });

        socket.on('disconnect', function() {
            if(username) {
                socket.broadcast.emit('user-left', username);
                username = null;
            }
        });
    });
}

// run app

app.listen(8080);

process.on('unhandledRejection', (reason, promise) => {
  process.exit(1);
});

0 个答案:

没有答案