【问题标题】:Node.js, Socket.io emit not workingNode.js,Socket.io 发出不工作
【发布时间】:2017-09-10 21:03:50
【问题描述】:

我正在Socket.io 中创建一个网站。但是emit 方法在我的代码中不起作用。我在我的代码中看不到任何错误。这是我的服务器代码。

var io = require("socket.io").listen(server);

//Some external codes for running server in Node.js

io.on("connection", function(socket) {
    //This line is working.
    console.log("Socket connected.");

    io.on("requestNewMap", function(data) {
        //Create new map object in here.
        io.emit("responseNewMap", { mapData: map });
    });
});

这是我的客户端 javascript 代码。

var socket = io();

socket.on("responseNewMap", function(data) {
    var map = data.mapData;

    //Draw map in canvas's context.
});

//setInterval runs this method every 2 seconds.
function requestNewMap() {
    socket.emit("requestNewMap");
}

【问题讨论】:

  • 你有没有尝试在连接外发射,顺便在连接内放一个日志,如果没有日志,那么就没有建立连接

标签: javascript node.js socket.io


【解决方案1】:

这部分可能是错误的:

io.on("requestNewMap", function(data) {
    //Create new map object in here.
    io.emit("responseNewMap", { mapData: map });
});

我会在那里使用socket

socket.on("requestNewMap", function(data) {
    //Create new map object in here.
    socket.emit("responseNewMap", { mapData: map });
});

我认为io.emit 应该可以正常工作,它只会将响应发送到每个连接的客户端,但io.on('requestNewMap',...) 将不起作用,因为requestNewMap 不是io 标准事件。

【讨论】:

  • 但是当我调用io() 时,它会成功连接服务器。我的console.log() 运行良好。
  • 他连接正常,他正在连接到他的网络服务器的 url 和端口。
  • 哦。这是真的。我忘了在我的代码中使用socket.on()。我会尝试看看它是否有效。我将io.on() 更改为socket.on() 并且它有效。谢谢。
  • 你们说得对,我总是输入地址,我不知道你可以不指定地址:)从答案中删除第一部分
【解决方案2】:

改一下

io.on("requestNewMap", function(data) {
    //Create new map object in here.
    io.emit("responseNewMap", { mapData: map });
});

进入这个

socket.on("requestNewMap", function(data) {
    //Create new map object in here.
    socket.emit("responseNewMap", { mapData: map });
});

您正在向服务器对象而不是客户端套接字添加事件侦听器。

【讨论】:

    【解决方案3】:

    我不确定,但我相信您的问题是您在客户端的函数编写得就像您期望“requestNewMap”传递数据一样。 而不是:

    io.on("requestNewMap", function(data){
    

    试试:

    io.on("requestNewMap", function(){
    

    或者传递一个空对象或一些其他类型的垃圾数据以及来自客户端的发射,如下所示:

    function requestNewMap() {
      socket.emit("requestNewMap", {});
    }
    
    function requestNewMap() {
      socket.emit("requestNewMap", undefined);
    }
    
    function requestNewMap() {
      socket.emit("requestNewMap", -1);
    }
    

    希望这是有用且正确的!

    编辑:事实证明这不是您问题的答案,但仍然值得考虑。如果您不传递数据,则应避免编写事件处理程序,就好像它需要数据一样。

    【讨论】:

      【解决方案4】:

      仅当您只想将“responseNewMap”事件发送回发件人时,此方法才能正常工作。

      socket.on("requestNewMap", function(data) {
          //Create new map object in here.
          socket.emit("responseNewMap", { mapData: map });
      });
      

      如果您想将事件发送回所有连接的用户,请执行此操作

      socket.on("requestNewMap", function(data) {
          //Create new map object in here.
          io.emit("responseNewMap", { mapData: map });
      });
      

      如果您使用这样的命名空间:

      io.of('/api/v1/chat').on('connection', function (socket) { 
      //Your code here
      });
      

      然后包含这样的命名空间:

      io.of('/api/v1/chat').emit("responseNewMap", { mapData: map })
      

      【讨论】:

        【解决方案5】:

        我将在整个 socket.emit 不工作的情况下作为对我自己和其他人的说明对此作出回应......

        所以我遇到了 socket.emit 没有触发发出初始请求的套接字的问题。问题不是问题,更重要的是客户的工作方式。我确实只有在使用 socket.emit 时才向发起者发送(这是我想要的,只有请求的人才能得到响应),但问题是我的应用程序中有多个套接字。

        我使用 ES6 和导入(导入“socket io 客户端 js 的路径”),这在没有 webpack 的情况下也是一个问题,除非你这样做,因为我有自己的 web 组件框架。

        我有 3 个组件都从 io() 创建了一个套接字,期望它们使用相同的管理器,而它们却没有。

        socket.io 不会对许多创建 this.socket = io(); 的 mjs 文件使用相同的管理器;它们确实都是新的隔离插座!所以请记住这一点,您可能会将消息返回到发送请求的套接字,但如果您的侦听器位于另一个组件中,那么就会有不同的 socket.id 并且本质上是一个全新的套接字连接。

        有一个选项可以传入名为 forceNew 的 io,默认情况下它是 true,因此它出现了,但是更改它仍然给我带来了相同的问题,尽管 ID 现在都相同,但是我似乎仍然无法获得侦听组件以从操作组件中的操作获取响应,即使两者现在具有相同的 ID。可能是错误或其他问题,不确定。

        所以简短的回答是通过没有 webpack 的 ES6 导入只需 import 'fsdfsd.js';并且为了解决问题,只生成一个套接字并在组件之间共享,因为套接字并不便宜,而且你不想为一个应用程序使用多个套接字,所以无论如何你都可能想要这样做!

        这是我第一次玩套接字,它们很棒,但是如果您只想要经过身份验证的人,请谨慎使用,不要将它们打开,如果没有经过身份验证,请放弃!

        希望这对某人有所帮助,让我迷路了一天。

        【讨论】:

          【解决方案6】:

          就我而言,将package.json 中的homepage 设置为"." 解决了这个问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-15
            • 2017-05-11
            • 1970-01-01
            • 1970-01-01
            • 2021-07-28
            • 2014-01-19
            • 2017-02-21
            相关资源
            最近更新 更多