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 未能发出函数的主要内容,如果未能解决你的问题,请参考以下文章