类型错误:socket.emit 不是函数

问题描述 投票:0回答:1

我正在尝试编写基本的在线游戏,只是为了检查我目前的网络编程水平。这是我现在拥有的一些代码:

var io = require('socket.io') (serv, {});
io.sockets.on('connection', function(socket) {
    console.log('1 '+socket);
    function fight (player,monster) {
        console.log('2 '+socket);
        monsterData = {};
        monsterData.name = monster;
        switch(monster){
            case 'rat 1st level':
            monsterData.hp = 50;
            monsterData.attack = 1;
            monsterData.money = Math.floor(Math.random()*3)+1;
            break;
        }
        result = attack(player,monsterData);
        console.log('3 '+socket);
        if(result.winner === 'player'){
            db.account.findOne({'username':player.username},function(err,player){
                money = player.money + monsterData.money;
                db.account.update({'username':player.username},{$set:{'money':money}});
                socket.emit('addToChat',{type:'system',message:'You win battle against "'+monster+'"'})
            });
        }
    }
    console.log('4 '+socket);
    socket.on('click',function(data){
        db.account.find({'username':data.username,'socket':data.socket},function(err,res){
            if(res.length > 0) {
                position = 0;
                //console.log('x - '+data.x+'; y- '+data.y);
                            /* RIGH BAR */
                if(data.x>(1024-200) && data.x<1024 && data.y>80) {
                    // if(data.y>50&&data.y<80)
                    //  position=1; 
                    if(data.y>80&&data.y<110){
                        monster='rat 1st level';
                    }
                    if(data.y>110&&data.y<140){
                        monster='2ndMonster';
                    }
                    if(data.y>140&&data.y<170){
                        monster='3rdMonster';
                    }
                    if(data.y>170&&data.y<210){
                        monster='4thMonster';
                    }
                    db.account.findOne({'username':data.username},function(err,res){
                        db.account.update({'username':res.username},{$set:{'inFight':true,'monster':monster}});
                        io.sockets.emit('fightStart',{'username':res.username,'monster':monster});
                        result = fight(res,monster);
                    });
                    

                          /* /RIGHTBAR */
                }
                //console.log(position);
            }
        });
    });

    socket.on('signIn',function(data){                                                                  
        isValidPassword(data,function(res){                                                     
            if(res){                                                                                    
                db.account.find({'username':data.username},function(err,player){                        
                    player = player[0];
                    socket.emit('signInResponse',{
                        success:true,
                        username:player.username,
                        password:player.password,
                        level:player.level,
                        money:player.money,
                        hp:player.hp,
                        maxhp:player.maxhp
                    });   
                });

            } else {                                                                            
                socket.emit('signInResponse',{success:false,reason:'wrong login or password'});         
            }
        });
    });
}

所以,基本上,我可以在

socket.on('signin')
中获取套接字变量,但是当我尝试在函数战斗或
socket.on('click')
中获取它时,它会给我错误,即套接字未定义,或者给我错误,因为套接字只是客户端的
socket.id
,我无法发出数据。

我需要什么

一些如何在战斗功能中访问变量套接字,以便能够向特定玩家发送数据。

javascript node.js socket.io
1个回答
0
投票

你应该直接使用io:

io.on('connection', function(socket){
    socket.on('xxx', function(obj){
        io.emit('xxx', {xxx: xxx})
    })
})
© www.soinside.com 2019 - 2024. All rights reserved.