每个页面更新后,我有+1套接字连接。
module.exports = function(io, client) {
var GameController = {
gamePage: function(req, res) {
client.hget('games', 'game.' + req.params.id, function (err, result) {
if (err) return result(err);
var game = JSON.parse(result);
io.on('connection', function (socket) {
console.log('send');
console.log(socket.id);
io.emit('get_bets', game.players);
});
res.render('pages/game', {
title: 'Game - ' + req.params.id,
user: req.user,
game: game
});
});
};
return GameController;
});
路由文件:
module.exports = function(io, client) {
var express = require('express');
var router = express.Router();
var GameController = require('controllers/GameController')(io, client);
router.get('/:id', GameController.gamePage);
...
return router;
};
客户端做出反应:
var Game = React.createClass({
getInitialState: function() {
this.socket = io();
return {
bets: null
}
},
socketGetBets: function() {
var that = this;
this.socket.on('get_bets', function(data) {
console.log('get bets');
that.setState({ bets: data });
});
this.socket.on('rand', function(data) {
console.log(data);
});
},
...
但是调试之后,我发现客户端没有问题。
app.js文件:
var socket_io = require('socket.io');
var io = socket_io();
app.io = io;
//route
var game = require('./routes/games')(io, client);
bin / www文件:
var server = http.createServer(app);
var io = app.io;
io.attach( server );
页面更新后,io.on(“ connection”)事件在控制台中向我显示“发送”消息,第二页更新后,我具有“发送”,“发送”,第三次更新-“发送”,“发送”,“发送”等。比出现内存泄漏警告。控制台日志socked.id多次显示相同的值。
每次调用on
,无论是io.on
还是socket.on
,都在注册一个事件处理程序。在这种情况下,您可能不想io.on('connection')
在路由内部进行调用,因为每次访问该路由时都会注册一个新的连接处理程序。这就是为什么您看到控制台中记录了累积消息。
实际上,您可能根本不希望将快速路由与套接字函数混合使用,因为它们是不同的协议,并且可以彼此独立地工作。
// server side
// this should only be called once per connection.
io.on('connection', function (socket) {
// handle socket protocol stuff.. fetching server data, sending data
socket.on('fetch bets', function() {
// get game.players from server
// updating other sockets
io.emit('get_bets', game.players);
})
})
app.get('/route', function (req, res) {
// handle http protocol stuff.. fetching server data, sending data
// send data back to caller
res.json(data)
})
这同样适用于socket.on
在您的客户端。似乎您'get_bets'
每次调用时都会添加一个新的事件处理程序socketGetBets
。
相反,您可能想一次注册该事件处理程序,可能在componentDidMount
或中componentWillMount
。另外,由于套接字连接可以视为您的应用程序的全局连接,因此您可以在应用程序上方创建连接。
// client side
var socket = io()
var Game = React.createClass({
getInitialState: function() {
return {
bets: null
}
},
componentWillMount: function() {
var that = this
socket.on('get_bets', function(data) {
that.setState({ bets: data })
})
}
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句