【问题标题】:Socket.io Client connects, socket.on events don't fireSocket.io 客户端连接,socket.on 事件不触发
【发布时间】:2019-02-13 16:01:22
【问题描述】:

我正在使用包“socket.io-client”:“^2.2.0”

在我的网络应用程序中,我在引导程序上有以下代码:

export const socket = io.connect(process.env.VUE_APP_SOCKET_URL, {
  reconnection: true,
  reconnectionDelay: 1000,
  reconnectionDelayMax: 5000,
  reconnectionAttempts: Infinity
})

然后在应用程序周期的后期,我有以下监听器

import socket from './api/socket'

function handleAutobox() {
  console.log('handling autobox')
}
console.log('Connect')
socket.on('autobox', handleAutobox)

在生产中检查时,我看到代码已运行(已记录“连接”)。我看到套接字网络流量被捕获:

问题是永远不会调用handleAutobox 函数。如果我确定我已经运行了 socket.on,那怎么可能?

更新:添加服务器端代码:

let socket_io = require('socket.io'),
    io;

let server = http.createServer(app)
  .listen(app.get('port'), () => {
    io = socket_io.listen(server);
    console.info(`App listening on port ${port}!`);
  });

// ...inside route function:
io.emit('autobox', autobox);

更新:添加socket.on('connect' ...)

在创建套接字后直接添加socket.on('connect' ...) 时,我发现它也没有被调用。而不是io.connect(...),我尝试@Keith 的io() 建议与单独的io.on 事件,仍然没有骰子。

所以真正的问题是没有建立“连接”,但数据仍在网络上发送。我想我真的不了解套接字。明明没有建立连接也能发送数据?

【问题讨论】:

  • 奇怪的是,这只发生在生产中。在我的开发环境中,一切正常。
  • 你试过io.on('autobox'...,因为从io.connect返回的套接字我认为是物理套接字,而不是socket.io的处理程序..
  • io.on 不是像这样导入的函数:import io from 'socket.io-client'
  • 嗯,我通常创建一个实例..const socket = io(); socket.on("cmd",... 然后我们有函数on...

标签: javascript sockets


【解决方案1】:

看起来你的console.log('Connect') 是全局的,所以无论如何它都会运行。尝试将其放入连接套接字时调用的函数中。所以在你的服务器上你有类似的东西

io.on('connection' function(socket) {
  console.log('Socket Connected');
// Update
io.emit('autobox', autobox);
  socket.emit('autobox');
})

U 不能将套接字代码放置在路由中,它必须在此连接回调中并且仅在此回调中。至少那是我被告知的。希望这会有所帮助

【讨论】:

  • 我添加了console.log('Connect') 只是为了表明socket.on 已经运行。我想写得更好,console.log('socket.on ran')。但如果网络显示帧通过并且socket.on 运行,为什么它不会触发事件?
  • 根据本文档socket.io/docs/client-api/#Event-%E2%80%98connect%E2%80%99you should register event handlers outside of connect。如前所述,网络显示我正在接收数据……这不是我已连接的证据吗?
  • 请发布有关 socket.io 的服务器端代码
  • @jbodily 是的,我在考虑服务器端,
  • @djorborn - 我想你会觉得这很简单。除了发送自动框外,我没有做任何花哨的事情,这就是您在问题中包含的网络图片中看到的内容。奇怪,因为这在开发中有效。
猜你喜欢
  • 1970-01-01
  • 2012-06-23
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多