0

ウェブサイトでインスタント チャット機能をサポートするためのバックエンドとして使用するノード エクスプレス サーバーがあります。私が抱えている問題は、誰かがブラウザーを閉じたときに、友達の友達リストでステータスが「オフライン」に更新されないことです。req.on('close', function(){}); というノードに関数があることは知っています。しかし、それをサーバーファイルに含める方法がわかりません。正しい方向へのヒントは大歓迎です。これは、関連すると思われるエクスプレスサーバーコードのスニペットです。

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);
4

1 に答える 1

2

HTTP はステートレス プロトコルであるため、「接続ユーザー」という概念はありません。ユーザーが移動するときにサーバーに通知するには、何らかのクライアント側メカニズムを使用する必要があります (おそらくonbeforeunload、メッセージをサーバーに投稿するハンドラーを使用します)。closeある種のロングポーリングメカニズムを使用していない限り、あなたが言及したイベントは役に立ちません(しかし、私はあなたがそうではないと思います)。

チャットを実装するにsocket.ioは、ブラウザーとサーバー間の永続的な接続を維持し、ブラウザーが接続を閉じたかどうかを通知するメカニズムが組み込まれている (ユーザーが別の場所に移動した場合など) のほうがよいかもしれません。

于 2013-10-12T07:40:39.840 に答える