2017-09-30 10 views
0

私は、データの変更時にビューを更新する必要のあるWebアプリケーションを構築しています。この目的のために私はsocket.ioを使用しています。これは、server.jsファイルに設定され:ソケットがルート内で発光しない

const io = require('socket.io')(http); 

/* WEB SOCKET INITIALISATION 
----------------------------------------- */ 
io.on('connection', function(socket) { 
    io.emit('new connection', 'new connection'); 

    socket.on('disconnect', function() { 
    io.emit('offline', 'offline') 
    }); 
}); 

私のコンソールに見てみると、それはできるだけ早く私はページ上だと「新しい接続」のログ。今度は私が作ったルートの一つでソケットを使いたいと思っています。これを可能にするために、私は私がこのように、ルートを必要とする場所にioをバインド:

const dashboardRouter = require('./routes/dashboard')(io); 

これは、ルートの一部がどのように見えるかであるように:

/* MAKE SOCKET.IO ACCESSABLE 
--------------------------------------------------------------- */ 
module.exports = function(io) { 

    /* INDEX ROUTE 
    -------------------------------------------------------------- */ 
    router.get('/', account.checkSession, playwalls.statistics, playwalls.getYours, function(req, res, next) { 
    io.emit('update', 'testen'); 
    res.locals.username = req.session.username; 
    res.render('dashboard/index'); 
    }); 

    /* EXPORT ROUTER 
    --------------------------------------------------------------- */ 
    return router; 

} 

問題があるときにIアップデートを発行すると、コンソールにログインしません。私はconsole.log(io)を経路の中に置くと、socket.ioが利用可能であるように見えます。私はターミナルコンソールの内部でエラーが発生しません。

これは次のようになり、クライアント側のJavaScriptファイルとは何ですか:

(function() { 

    const socket = io(); 

    socket.on('update', function(data) { 
    console.log('Works'); 
    }); 

    socket.on('new connection', function(data) { 
    console.log(data); 
    }); 

}()); 

私はここで間違って何をしているのですか?ソケットがメッセージを発行する方法を確認するにはどうすればよいですか?誰かが私にこれを助けることを願っています!

ありがとうございます。

+0

私はこの権利を得ているかどうかはわかりません。しかし、ページ/ルートがロードされている間は、WebSocketに接続していません。発行されても、 'io.emit'が呼び出された後にページが読み込まれるため、表示されません。あるいは、あなたは 'ダッシュボード'ルートへのAJAXコールをしていますか? –

答えて

1

このルート:

router.get('/', account.checkSession, playwalls.statistics, playwalls.getYours, function(req, res, next) { 
    io.emit('update', 'testen'); 
    res.locals.username = req.session.username; 
    res.render('dashboard/index'); 
    }); 

は、他のすべての接続ページにブロードキャストしますが、このルートをトリガし、特定のユーザーのために何も表示されません。これは、このルートをトリガーしたユーザーがページのリクエストとロードの途中であり、まだsocket.ioに接続されていないためです。次のように

この要求を行ったユーザのための一連の操作は次のとおりです。

  1. ブラウザはsocket.ioを切断し、Javascriptをシャットダウン含み、前のWebページを下に閉じます。
  2. ブラウザリクエスト/ URL。
  3. サーバーは、そのURLのルートハンドラーを呼び出します。
  4. ルートハンドラは、現在接続されているすべてのクライアントに送信するio.emit()を呼び出しますが、この要求を行っているクライアントは現在接続されていません。
  5. ルートハンドラはページをレンダリングしてブラウザに返します。
  6. ブラウザはページを受信して​​レンダリングします
  7. ブラウザはページ内でJavaScriptを実行し、socket.io接続が行われます。

io.emit()を呼び出すと、このシーケンスからわかるように、要求を行ったブラウザはsocket.ioに接続されません。基本的には、レンダリングしているページと同じルートでレンダリングされているページには出力できません。

+0

答えをいただきありがとうございます。明確な方法で理解するまでに時間がかかりましたが、いくつかの演奏、テスト、デバッグの後、私はフローをよく理解して問題を修正しました! –

関連する問題