gpt4 book ai didi

node.js - 乘以 io.on ("connection")

转载 作者:太空宇宙 更新时间:2023-11-03 21:58:06 25 4
gpt4 key购买 nike

每次页面更新后,我都会有 +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;
};

客户端 react :

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.onsocket.on ,您正在注册一个事件处理程序。既然如此,您可能不想调用 io.on('connection')在路由内部,因为每次访问该路由时您都会注册一个新的连接处理程序。这就是您看到控制台中记录累积消息的原因。

事实上,您可能根本不想将快速路由与套接字功能混合在一起,因为它们是不同的协议(protocol)并且将彼此独立工作。

// 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 })
})
}
...

关于node.js - 乘以 io.on ("connection"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34845994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com