0

誰かが私が間違っていることを理解するのを助けることができるかどうか疑問に思いました:

私のクライアント Web ページは、サーバーとの接続を開始し、別のスレッドのワーカー プロセスによって db で状態が更新されている長期実行プロセスをリッスンし、更新をブラウザーに送り返します。app.post() メソッドで socket.io 接続を定義します。これは、以下の poll() 関数によって処理されます (招待チェック コードを少し下までスクロールします)。

ただし、新しい Web クライアントが接続すると、チャネルが 1 つしかないかのように、以前のクライアントにメッセージが追加されます。ブラウザごとに個別のチャネルがないのはなぜですか?

//Create server
var express = require('express'),
    app = express(),
    http = require('http'),
    server = http.createServer(app),
    io = require('socket.io').listen(server);

io.set('log level', 1); // reduce logging
io.configure(function () {
    io.set("transports", ["xhr-polling"]);
    io.set("polling duration", 10);
});

app.post('/api/users', function (req, res) {
    if (!req.body.auth.accessToken) {
        req.body.auth.accessToken = req.body.auth.authResponse.accessToken;
    } //fb return object is different depending on whether it is a first login or subsequent
    logger.log('debug', '/api/users:POST', req.body);
    io.sockets.on('connection', function (socket) {
        socket = socket;
        socket.emit('update', {
            status: 200 //send initialization ping
        });


        //check if user has valid invite, if not try to invite
        db.getTotalUserInvites(function (err_inv, res_total) {

            db.getUserInvite(req.body.fid, function (err_check, res_check) {
                logger.log('debug', 'Total invites issued=' + res_total);

                    //process report - all we need is accesToken, processReport will do the rest
                    mine_fb.processUser(req.body.auth.accessToken, socket, function (User,socket) { //pass channel properly
                        db.getReportStatus(User.fid,socket, function (result,socket) {
                            logger.log('debug', 'report status', result);
                            if (result) {
                                if (socket && (result.report_status == -1)) {
                                    logger.log('debug', 'report already processed. retrieving uniq_id ' + result.uniq_id);
                                    socket.emit('update', {
                                        status: -1,
                                        uniq_id: result.uniq_id
                                    });
                                    return true;
                                } else {
                                    if (socket && (result.report_status >= 0)) {
                                        logger.log('debug', 'we are in the middle of processing report ' + result.uniq_id);
                                        //in this case we become a listener and not a speaker

                                        function poll(socket) {
                                            db.getReportStatus(User.fid, socket,function (r,socket) {
                                                socket.emit('update', { //!!!! THIS EMITS TO ALL CONNECTED BROWSERS
                                                    status: r.report_status,
                                                    uniq_id: r.uniq_id
                                                }); //...socket
                                                if ((r.report_status >= 0) && (socket)) { 
                                                    logger.log('debug', 'polling...');
                                                    _.delay(poll, 2000, socket);
                                                }

                                            }); //get rerpot
                                        }; //end poll
                                        socket.on('disconnect', function () {
                                            socket=null;
                                        });
                                        poll(socket);

                                    } // else we're in the middle
                                } //done checking status
                            } //end of seq
                        });
                    return res.send();
                });
            });

        });
    });
});
4

2 に答える 2

-1

スコープio.sockets.on('connection', function (socket)内に 入れるべきではありません 。app.post

外に置いてもう一度試してみてください。おそらく正しく動作します。

クライアントが何らかの URL にアクセスするたびに接続をリッスンするのではなく、サーバーの起動時に一度だけ接続をリッスンする必要があります。

于 2013-08-06T15:16:07.637 に答える