Socket.io 未能发出函数

Posted

技术标签:

【中文标题】Socket.io 未能发出函数【英文标题】:Socket.io failing to emit functions 【发布时间】:2021-02-26 08:06:29 【问题描述】:

我一直在使用 socket.io 开发游戏,发现当第二个参数是函数时,socket.emit 函数似乎无法正常工作。当我使用 socket.on 并尝试调用(甚至是 console.log)该函数时,它说 data.testFunction 不是函数。我也尝试过使用对象,但收到后,所有对象方法都丢失了。 node.js 代码:

const
  http = require("http"),
  fs = require("fs"),
  port = 9009;

const server = http.createServer((req, res) => 
  res.writeHeader(200, "Content-Type": "text/html");
  res.write(fs.readFileSync("client/index.html", "utf8"));
  res.end();


server.listen(port);

const io = require("socket.io")(server, );

io.sockets.on("connection", (socket) => 
  
  console.log("socket connection");
  
  socket.emit("test", () => return 2+2;);
  

还有index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Game</title>
  <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap" rel="stylesheet">
  <style>
    *
      margin: 0;
      overflow: hidden;
      background: #333;
      font-family: "Poppins", sans-serif;
    
    canvas
      background: #777;
    
  </style>
</head>
<body>
  <script src="https://cdn.socket.io/socket.io-3.0.0.js"></script>
  <script>

const socket = io();

socket.on("test", (func) => 
  func();
  console.log(func);
);

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

我得到了什么:

Uncaught ReferenceError: func is not defined
undefined

【问题讨论】:

不能直接传递函数。 Socket.io documentation 声明 Any serializable data structures can be emitted,函数不是数据结构。 欢迎来到 SO!为什么要通过套接字传递函数?你真的想在这里完成什么?对我来说似乎是一个 xy 问题。 【参考方案1】:

将函数作为字符串传递

socket.emit("test", (() => return 2+2;).toString());

调用函数存储为字符串

socket.on("test", (func) => 
  eval(func)();
  console.log(func);
);

测试

const fun =  (() => return 2+2;).toString()
console.log(typeof fun)
console.log(eval(fun)())

【讨论】:

【参考方案2】:

我认为您需要 io() 的特定 URL

【讨论】:

以上是关于Socket.io 未能发出函数的主要内容,如果未能解决你的问题,请参考以下文章

在 socket.io 上从客户端捕获所有事件“发出”

socket io 的 emit 函数是如何工作的?

Node.js socket.io 没有响应 iOS socket.io 发出请求

socket.io 发出多次

socket.io 发出不接收消息的原因?

Socket.io 客户端无法发出消息