【问题标题】:How do I know when user disconnects with express server我如何知道用户何时与快速服务器断开连接
【发布时间】:2013-10-12 06:05:41
【问题描述】:

我有一个 node express 服务器,我用它作为后端来支持我网站上的即时聊天功能。我遇到的问题是当有人关闭他们的浏览器时,他们的状态不会在他们朋友的好友列表中更新为“离线”。我知道节点中有一个名为 req.on('close', function(){}); 的函数但我只是不确定如何将它包含在我的服务器文件中。任何正确方向的提示将不胜感激。这是我认为相关的快速服务器代码的 sn-p:

var app = express();
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.bodyParser());    
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
next();
});

app.use(require('./middleware/im')({
maxAge: 60 * 1000,
reapInterval: 60 * 1000,
    authentication: require('./libs/authentication/' + AUTH_LIBRARY) 
}));


    app.set('root', __dirname);

// 监听器端点;在中间件中处理 app.get('/listen', function(){});

app.post('/message', function(req, res) {
    res.find(req.body['to'], function(user) {
        if(!user)
           return res.send(new packages.Error('not online'));
        res.message(user, new packages.Message(
        req.session.data('username'),
        req.body.body
    ));


});

});

app.post('/message/typing', function(req, res) {
if(~packages.TYPING_STATES.indexOf('typing' + req.body['state'])) {
    res.find(req.body['to'], function(user) {
        if(user) {
            res.message(user, new packages.Status(
                req.session.data('username'),
                'typing' + req.body.state
            ));
        }

        // Typing updates do not receive confirmations,
        // as they are not important enough.
        res.send('');
    });
} else {
    res.send(new packages.Error('invalid state'));
}

});

app.post('/status', function(req, res) {

if(~packages.STATUSES.indexOf(req.body['status'])) {
    res.status(req.body.status, req.body.message);
    res.send(new packages.Success('status updated'));
} else {
    res.send(new packages.Error('invalid status'));
}
});



    app.post('/clear', function(req, res) {

    app.use(require('./middleware/im')({
       clear: req.sessionID,
       maxAge: 60 * 1000,
   reapInterval: 60 * 1000,
   authentication: require('./libs/authentication/' + AUTH_LIBRARY)
}));
    req.sessionID = null;
res.send(new packages.Success('cleared session'));
app.use(require('./middleware/im')({
   clear: 0,
       maxAge: 60 * 1000,
      reapInterval: 60 * 1000,
    authentication: require('./libs/authentication/' + AUTH_LIBRARY)

}));

});

app.post('/online', function(req, res) {
 var d = new Date();
  var n = d.getTime() + 60;
 req.sessionID.expires = n;
 res.status(req.body.status, 'available');
  res.send(new packages.Success('Online'));

});

app.post('/signoff', function(req, res) {
res.signOff();
res.send(new packages.Success('goodbye'));

});

https.createServer(options, app).listen(8000);

【问题讨论】:

    标签: javascript express


    【解决方案1】:

    HTTP 是一种无状态协议,因此它没有任何“已连接用户”的概念。当用户离开时,您需要使用某种客户端机制来通知您的服务器(可能使用onbeforeunload 处理程序将消息发布到服务器)。你提到的close 事件没有用,除非你使用某种长轮询机制(但我不认为你是)。

    要实现聊天,更好的解决方案可能是socket.io,它在浏览器和服务器之间保持永久连接,并具有内置机制来通知浏览器是否关闭了连接(如果用户导航离开,例如)。

    【讨论】:

    • 这里是使用socket.io聊天的描述:net.tutsplus.com/tutorials/javascript-ajax/…和一个视频:youtube.com/watch?v=pNKNYLv2BpQ
    • 你知道用socket.io替换我的客户端代码中的Ajax调用是否困难?我认为这是我绝对需要做的事情。 Socket.io 看起来好多了。
    • @ArjunPatel 取决于您的 AJAX 调用的复杂性,但通常不是什么大问题。
    • 好的,知道了。我现在有点困惑。如果 HTTP 是无状态协议,是否意味着它不知道会话何时过期?
    • @ArjunPatel 没错。当会话 cookie 过期时,浏览器不会再将它发送到服务器,但服务器不会知道浏览器 used 是否有 cookie。因此,它不知道它是在与新访问者打交道,还是在与会话过期的先前访问者打交道。
    猜你喜欢
    • 2018-02-20
    • 2011-02-22
    • 2014-03-13
    • 2021-12-22
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多