我正在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");
}
答案 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
解决了该问题。