2

node.js と express.js を使用して簡単なチャット アプリケーションを作成していますが、何か間違っているような気がします。チャット自体は、最初のページの読み込みでは正常に機能しますが、ページのリロードごとに、すべてのメッセージが 2 回以上 (ページのリロード数によって異なります) 印刷されます。ページをリロードするたびに新しいリスナーが作成されるようです。私が理解していることから、リスナー コード (io.socket) をルーター ハンドラーから移動する必要がありますが、ページ リクエストでページをレンダリングすると共に、どこに移動し、後でそれを呼び出す方法がわかりません。どんな助けでも感謝します。ありがとう。

ここに私のアプリコードがあります:

./app.js

var express = require("express");
var app = express();
var test = require("./routes/test")

var port = 3000;
app.set("port", port);
app.set("views", __dirname + "/views");
app.set("view engine", "jade");

app.get("/test", test.test);

var io = require("socket.io").listen(app.listen(port));
app.set("io", io);

console.log("Listening on port " + port);

および ./routes/test.js

exports.test= function(req, res) {

res.render('test');
var app = req.app;
var io = app.get('io');

io.sockets.on('connection', function (socket) {
    socket.emit('message', { message: 'welcome to the chat' });
    socket.on('send', function (data) {
        io.sockets.emit('message', data);
    });
});
}
4

2 に答える 2

1

test.js に socket.io('disconnect', function () {...}) を追加し、'connection' イベントと 'disconnect' イベントに console.log(...) を追加しました。これにより、n 回目のページ更新で、サーバーが n の切断イベントと n+1 の接続イベントを取得したことが確認されました。

ページの更新は socket.io への切断のように見え、失われた接続に再接続し、接続イベントをトリガーします。同時に、 socket.io('connection', ...) が別の接続をトリガーします。

リフレッシュするたびに、着信メッセージ用のリスナーをもう 1 つ追加し、それぞれが socket.emit('message', ...) メッセージを取得します。

いくつかのコードを試しましたが、変更するとコードが実行されるはずです

io.sockets.on('connection', function (socket) {

io.sockets.once('connection', function (socket) {

後者はイベント ハンドラーを初回のみ実行するためです。

于 2013-06-20T15:24:11.673 に答える