Node.js,Socket.io发出无法正常工作

时间:2017-04-14 15:11:39

标签: javascript node.js socket.io

我正在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");
}

6 个答案:

答案 0 :(得分:3)

这部分可能是错误的:

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无法正常工作标准事件。

答案 1 :(得分: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 });
});

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

答案 2 :(得分:1)

我不确定,但我相信你的问题是你在客户端的功能是像你一样写的' requestNewMap'要传递数据。 而不是:

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

尝试:

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

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

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

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

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

希望这是有用和正确的!

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

答案 3 :(得分:0)

这仅在您只想将“ 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 })

答案 4 :(得分:0)

我将对此做出回应,作为对整个 socket.emit 无法正常工作的情况...

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

我使用 ES6 和导入(import 'path to socket io client js')这也是没有 webpack 的问题,除非你这样做,因为我有自己的 web 组件框架。

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

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

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

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

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

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

答案 5 :(得分:0)

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

相关问题