gpt4 book ai didi

javascript - 为什么在快速路由内没有触发 socket.io 回调

转载 作者:行者123 更新时间:2023-12-03 05:40:21 25 4
gpt4 key购买 nike

我有以下设置(重要部分仅为简洁起见):

app.js

...
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);

server.listen(port, function() {
console.log(`Server is listening on port: ${port}`);
});

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

const routes = require('./routes/index')(io, passport);
app.use('/', routes);

index.js(服务器)

router.get('/game/:id', isAuthenticated, (req, res) => {

if (req.id)
{
var game = Game.findOne({_id: req.id}, (err, obj) => {
io.on('getGameInfo', (socket) => {
io.emit('gameInfo', obj);
});

res.render('game', obj);
});
}
else
{
// Id not valid, do something
}
});

客户:

const socket = io('http://localhost:3000');

socket.on('gameInfo', function(data) {
console.log(data);
}.bind(this));

socket.on('connect', () => {
socket.emit('getGameInfo');
});

所以基本上,一旦我知道客户端已连接,并且 getGameInfo 监听器已在游戏路由中设置,我想发出 getGameInfo 调用。但是当我从客户端发出 getGameInfo 时,服务器回调没有被命中。我不确定我是否遗漏了一些明显的东西,或者这是否是一个关闭问题,或者我是否只是度过了那些日子,或者我是否以完全错误的方式处理这件事。

最佳答案

这里存在多个问题。我将首先展示在服务器上监听传入的 socket.io 消息的正确方法:

io.on('connection', function (socket) {
// here's where you have a new socket and you can listen for messages
// on that socket
console.log('connection');
socket.on('gameInfo', (data) => {
socket.emit('gameInfo', obj);
});
});

一些问题:

  1. 在服务器上,您通过socket监听消息。对象,而不是通过io目的。因此,您通常会在 io.on('connection', ...) 中添加这些事件监听器。处理程序,因为这是您首先看到新连接的套接字的地方。

  2. 您几乎不想在 Express 路由处理程序中添加事件监听器,因为它会被调用很多次。此外,在调用路由处理程序时,浏览器尚未接收页面,也不会连接,因此即使这是一个可以做事情的地方,页面也还没有连接。

  3. 当您只想将消息发送回一个连接时,可以使用 socket.emit() 发送该消息。 ,不是io.emit()io.emit()向所有连接的客户端广播,我认为这不是您想要的。

  4. 我建议您不要为客户端和服务器重载相同的消息名称来表示两个不同的事物,因为这可能会在阅读代码或在客户端和服务器之间共享某些代码时导致困惑。您的客户端实际上正在发送一条“getGameInfo”消息,然后您的服务器响应一条包含 gameInfo 的“gameInfo”消息。

如果在路由处理程序中,您想要 .emit()从该页面的套接字(看起来您正在尝试执行此操作),那么您必须做一些工作来在当前页面的 session 和该页面的套接字之间创建链接。有多种方法可以做到这一点。如果您使用任何 session 中间件,则可以记录 socket在套接字连接点的 session 中。然后,从您的快速路由中,您可以随时从 session 对象获取该套接字。

关于javascript - 为什么在快速路由内没有触发 socket.io 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40565144/

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