在我的插座里。io应用程序,我正在尝试将房间中的一组用户发送到客户端,以便创建一个显示房间中所有用户的ul
元素。文档中说,您可以使用以下代码返回给定命名空间和文件室中的所有套接字实例:
// return all Socket instances in the "room1" room of the "admin" namespace
const sockets = await io.of("/admin").in("room1").fetchSockets();
但是,它涉及到等待
,这是我不太熟悉的。我只是把代码块放在一个async
函数中,我不确定这是最好的方法。
io.of('/game').on('connection', socket => {
console.log(`Socket ID: ${socket.id}`);
const cookies = cookie.parse(socket.handshake.headers.cookie || "");
console.log(cookies);
const currentUser = cookies['current_user'];
const roomName = cookies['room_name'];
socket.username = currentUser;
console.log(`${socket.username} connected to room "${roomName}"`);
socket.on('disconnect', () => {
console.log(`${socket.username} disconnected from room "${roomName}"`);
io.of('/game').in(roomName).emit('leave', socket.username);
});
socket.join(roomName);
(async() => {
const usersInRoom = await io.of('/game').in(roomName).fetchSockets();
console.log(`Number of users connected: ${usersInRoom.length}`);
io.of('/game').in(roomName).emit('join', { username: socket.username, users: usersInRoom });
})();
});
当我尝试运行此操作时,控制台中出现以下错误:
(node:9872) UnhandledPromiseRejectionWarning: RangeError: Maximum call stack size exceeded
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:28:19)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:9872) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:9872) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
我试着对此做了一些研究,发现了这个答案,建议将代码包装在try-catch
块中。我已经做到了:
(async() => {
try {
const usersInRoom = await io.of('/game').in(roomName).fetchSockets();
console.log(`Number of users connected: ${usersInRoom.length}`);
io.of('/game').in(roomName).emit('join', { username: socket.username, users: usersInRoom });
}
catch(e) {
console.log(e);
}
})();
但是我仍然得到一个错误:
RangeError: Maximum call stack size exceeded
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:28:19)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
at hasBinary (<path>\node_modules\socket.io-parser\dist\is-binary.js:49:63)
我该怎么解决这个问题?任何帮助将不胜感激。
正如我们在评论中所讨论的,您不能发送整个套接字。通过套接字的io连接对象。io连接,因为它不能转换为JSON。
如果您真正想要发送的只是附加到socket.io对象的username
属性的列表,那么您可以仅使用这些用户名创建一个数组。
更改此项:
io.of('/game').in(roomName).emit('join', { username: socket.username, users: usersInRoom });
对此:
const usernameList = usersInRoom.map(s => s.username);
io.of('/game').in(roomName).emit('join', { username: socket.username, users: usernameList});
问题内容: 我有一台服务器,可能导致以下输出死亡: 但是,如果没有堆栈转储或跟踪,就无法确定这是无限递归还是只是链太大而已,更不用说问题函数在哪里了。 使用该选项运行Node 不仅使我的测试运行缓慢(正如人们期望的那样),而且没有重现该问题。 有人有任何解决方案或提示来深入了解此问题吗? 问题答案: 看来目前的答案是:站稳脚步,等待Node.js更新到新的V8版本,或者使用此Chromium项目错
问题内容: 当我运行我的代码时,Node.js引发由过多的递归调用引起的异常。我试图将Node.js堆栈大小增加,但是Node.js崩溃而没有任何错误消息。当我不使用sudo再次运行此命令时,Node.js将输出。是否有可能在不删除递归调用的情况下解决此问题? 问题答案: 您应该将递归函数调用包装到 , 要么 函数使node.js有机会清除堆栈。如果您不这样做,并且有很多循环没有任何 真正的 异步
问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:
如果用户未登录,我尝试将用户重定向到“TrapPage”。 这是我的代码: 当我将函数requireAuth放在onEnter上时,控制台给我一个错误: 我是一个反应迟钝的人,请耐心点:) 我的代码有什么问题?
我正在使用我岳父让我建立的一个网站作为学习React的借口。我不是一个天生的JavaScript开发人员(更喜欢后端),我知道我下面的代码中可能有一些递归元素,但我就是看不到。谁能告诉我我做错了什么?
这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返