繁体   English   中英

Node.js、Socket.io 发出不工作

[英]Node.js, Socket.io emit not working

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

这部分可能是错误的:

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.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 });
});

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

我不确定,但我相信你的问题是你在客户端的函数是像你期望的 '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);
}

希望这是有帮助和正确的!

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

只有您只想将“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 })

我将对此做出回应,作为对整个 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。 可能是错误或其他原因,不确定。

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

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

希望这对某人有所帮助,让我迷失了一天或太多。

就我而言,将homepage设置为"." package.json修复了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM