Javascript 我能';无法到达服务器端的socket.io?

Javascript 我能';无法到达服务器端的socket.io?,javascript,node.js,express,socket.io,Javascript,Node.js,Express,Socket.io,我最近开始使用socket.io,并开始掌握它的窍门。但是一夜之间有些东西坏了,我不知道为什么。 当我调用socket.id(在socket.on中)时,我没有定义。但在其他socket.on函数中,它工作良好 有人能解释一下为什么这个突然停止工作了吗?下面是我的代码 这是我的App.js: socket.on('selectedcard', function(data){ // if(localStorage.getItem("legstapel" != null)){ //

我最近开始使用socket.io,并开始掌握它的窍门。但是一夜之间有些东西坏了,我不知道为什么。 当我调用socket.id(在socket.on中)时,我没有定义。但在其他socket.on函数中,它工作良好

有人能解释一下为什么这个突然停止工作了吗?下面是我的代码

这是我的App.js:

socket.on('selectedcard', function(data){
    // if(localStorage.getItem("legstapel" != null)){
    //   var legstapel = localStorage.getItem("legstapel");
    // }
    // else{
    //   var legstapel = [];
    // }
    var legstapel = GAME_LIST[1].legstapel;
    //console.log(PLAYER_LIST[socket.id].hand[data.card]);
    console.log("SOCKET: ", socket.id); //this returns undefined
    console.log("SOCKET: ", SOCKET_LIST[socket.id].id); //and therefor this line throws an undefined error
    var infonext = dealnodeal(GAME_LIST[1].topstapel, PLAYER_LIST[socket.id].hand[data.card]);
    if(infonext[2] == true){
      socket.emit('Boerchoice');
    }
    if(infonext[0] == true && infonext[1] == true){
      currentturn = nextplayer(currentturn);
    }
    else if (infonext[0] == true && infonext[1] == false) {
      goAgain();
    }
    else{
      socket.emit('wrong');
    }

    if(infonext[0] == true){
      legstapel.push(PLAYER_LIST[socket.id].hand[data.card]);         //this is where i need socket.id to work.
      console.log(legstapel)
      GAME_LIST[1].topstapel = PLAYER_LIST[socket.id].hand[data.card];
      GAME_LIST[1].legstapel = legstapel;
    };
    console.log("topstackchange     " + GAME_LIST[1].topstapel);
    //for(var i in SOCKET_LIST){
      var socket = SOCKET_LIST[i];
      socket.emit("topstackchange", {
        topstapel: GAME_LIST[1].topstapel
      });
    //};
  });
这是客户端:

  PickCard = function(Cname){
    var turn = localStorage.getItem('turn')
    console.log(turn);
    if(turn == '1'){
      console.log("card selected : " + Cname);
      socket.emit('selectedcard', {
        card: Cname
      });
    }
    else{
      console.log("Het is niet jouw beurt!");
    }
  };
编辑: 以下是简化代码:

io.on('connect', function(socket){
  var player = Player(socket.id);
  SOCKET_LIST[socket.id] = socket;
  PLAYER_LIST[socket.id] = player;


  socket.on('selectedcard', function(data){
    console.log(socket.id); //this is undefined
  });

});

因此,我认为问题在于,在使用
socket
模块连接之后,您没有使用
socket
变量

io.on('connect', function (socket) {
    //this socket refers to the local socket variable which has ID
    socket.on('someEvent', function () {
        //socket.id will be available here.
    })
})
参考:

编辑:由于OP在使用这段代码时遇到问题,我附加了一个POC以供参考

server.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(8080);
io.on('connection', function (socket) {
    socket.on('selectedcard', function (data) {
        console.log(socket.id); // this is working
        console.log(data);
    });
});
client.js(使用节点进行快速原型制作)

结果:

$ node server.js
U9GFjoTEzOsv0hmoAAAA
{ hey: 'yaya' }

因此,我认为问题在于,在使用
socket
模块连接之后,您没有使用
socket
变量

io.on('connect', function (socket) {
    //this socket refers to the local socket variable which has ID
    socket.on('someEvent', function () {
        //socket.id will be available here.
    })
})
参考:

编辑:由于OP在使用这段代码时遇到问题,我附加了一个POC以供参考

server.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(8080);
io.on('connection', function (socket) {
    socket.on('selectedcard', function (data) {
        console.log(socket.id); // this is working
        console.log(data);
    });
});
client.js(使用节点进行快速原型制作)

结果:

$ node server.js
U9GFjoTEzOsv0hmoAAAA
{ hey: 'yaya' }

在您提供的代码中,不清楚客户机和服务器是否成功握手-可能不是。成功连接时,您在服务器端获得了一个套接字实例,您可以与该实例获得套接字id。例如,请参阅您提供的代码中的Aritra的答案。不清楚客户端和服务器是否成功握手,可能不是。成功连接后,您将在服务器端获得一个套接字实例,您可以从中获取套接字id,例如,请参阅Aritra的答案

谢谢。那我怎么才能在插座里找到身份证呢?现在你可以了。socket.id将在事件回调中可用。
io.on
缺少
io.sockets.on
connection
connect
事件是相同的(别名)。您的事件处理程序在
io.on
连接正确吗?你可以发布完整的代码,但在你的问题中简化了吗?我已经添加了一个POC,请查看。一切正常,谢谢。那我怎么才能在插座里找到身份证呢?现在你可以了。socket.id将在事件回调中可用。
io.on
缺少
io.sockets.on
connection
connect
事件是相同的(别名)。您的事件处理程序在
io.on
连接正确吗?你可以发布完整的代码,但在你的问题中简化了吗?我已经添加了一个POC,请查看。一切正常。他们确实成功地握手了。或者至少我认为他们做到了。我认为这是因为这段代码是在服务器和客户端之前进行多次通信之后执行的。他们确实成功地进行了握手。或者至少我认为他们做到了。我认为这是因为这段代码是在服务器和客户机之前多次通信之后执行的。