当我在快速.js路由文件中使用 socket.io 时重复

Duplicates when I use socket.io in express.js route files

本文关键字:socket io 文件 路由 js      更新时间:2023-09-26

我在使用Node.JS/Socket.IO/Express时遇到了问题.JS我没有找到任何解决方案。

我使用:

"express": "~4.10.6"
"socket.io": "1.2.1"

Ubuntu Linux

我的问题是,当我运行服务器并在第一次运行时访问 localhost:3000/chat 时一切正常,但在刷新/2/3/4 后,插入聊天的消息重复。对于一次刷新,我必须在一次提交时收到相同的消息。对于两次刷新,我有 3 条相同的消息,依此类推。当我将套接字功能放在 express.js routes 文件夹中时,这种行为就开始了。

附言我是node.js/socket.io/express的新手.js

应用.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var chat = require('./routes/chat');
var app = express();
// Socket IO Things
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
// END - Socket IO Things
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
app.use('/chat', chat.random_function(io));

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

 module.exports = app;

server.listen('3000');
/

路线/聊天.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
    res.sendFile(__dirname + '/index.html');
});
module.exports = {
    router: router,
    random_function: function(io) {
        return function(req, res){
            res.sendFile(__dirname + '/index.html');
            io.sockets.on('connection', function (socket) {
                socket.on('send message', function (data) {
                    io.sockets.emit('new message', data);
                });
            });
        }
    }

};

客户端插座 (routes/index.html)

<html>
<head>
    <title>Chat with socket.io and node.js</title>
    <style>
        #chat {
            height: 500px;
        }
    </style>
</head>
<body>
<div id="chat"></div>
<form id="chat-message" action="">
    <input size="35" id="message"></input>
    <input type="submit"></input>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
        var socket = io.connect();
        var $messageForm = $('#chat-message');
        var $messageBox = $('#message');
        var $chat = $('#chat');
        $messageForm.submit(function(e){
            e.preventDefault();
            socket.emit('send message', $messageBox.val());
            $messageBox.val("");
        });
        socket.on('new message', function(data){
            $chat.append(data + "<br>");
        });

</script>
</body>
</html>

我该如何处理这个问题?提前感谢!我还检查了调试器,每次在服务器上都有 1/2/3/4/5 个不同的包。

您正在为每个/chat请求创建和附加新的connection侦听器。尝试将其移动到random_function之外,并可能为每个连接/客户端创建单独的socket实例。


(编辑)代码添加:

试试这个(应该可以工作,但我没有测试它)

应用.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var chat = require('./routes/chat');
var app = express();
// Socket IO Things
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
io.sockets.on('connection', function (socket) {
    socket.on('send message', function (data) {
        io.sockets.emit('new message', data);
    });
});
// END - Socket IO Things
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/users', users);
app.use('/chat', chat.random_function);

路线/聊天.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
    res.sendFile(__dirname + '/index.html');
});
module.exports = {
    router: router,
    random_function: function(req, res){
          res.sendFile(__dirname + '/index.html');
    }
};