簡體   English   中英

socket.emit無法正常工作,但socket.broadcast可以正常工作。 可能是范圍錯誤?

[英]socket.emit not working but socket.broadcast works fine. Possibly scope error?

我想用socket.io運行一個Node.js服務器,目前它會將數據包發送到房間中的其他客戶端socket.broadcast.to(socket.room).emit('AddPlayer'...但是似乎socket.emit(無法正常工作,不會將內容回復給請求事件的客戶端。任何人都可以看到我可能出問題的地方。我確實嘗試通過查詢函數傳遞套接字對象,但沒有任何效果。套接字變量的范圍還可以。

    io.on('connection', function (socket) { // on on client connection
        socket.on('login', function (uname, pword, email) { // on event login
            if (uname != "" && pword != "" && email != "" && validateEmail(email)) { // check if username password and email are all valid inputs
                Query('SELECT ID FROM Users WHERE Active AND Username="'+uname+'" AND Password="'+pword+'" AND Email="'+email+'";', function(rows, fields){
                    if (rows.length == 1){ // check if there was a result
                        socket.id = rows[0].ID
                        Query("SELECT S.RoomID, S.Name1,S.Name2,S.Name3, S.HP,S.MaxHP,S.SP,S.MaxSP,S.XP,S.Money,S.CellX,S.CellY,L.Skin,L.HairStyle,L.HairColor,L.ShirtID,L.ShoesID,L.TrowsersID,L.WepponID,L.HeadID FROM Stats S, Look L, Items I WHERE S.ID="+socket.id+" AND L.ID=S.ID GROUP BY S.ID; SELECT Q.ID AS QuestID, Q.LevelID AS LevelRequired, Q.XP, Q.Money, CASE WHEN S.Stage=0 THEN Q.NPCID1 WHEN S.Stage=1 THEN Q.NPCID2 END as NPCID,CASE WHEN S.Stage=0 THEN Q.Text1 WHEN S.Stage=1 THEN Q.Text2 END as Text, NPCs.RoomID, NPCs.ID FROM Quests as Q, QuestStages as S, Stats as St, NPCs WHERE S.QuestID = Q.ID AND St.LevelID <= Q.LevelID AND S.UserID=St.ID AND St.ID="+socket.id+";", function(rows, fields){
                            socket.room = rows[0][0].RoomID
                            socket.join(socket.room)
                            socket.jointime = new Date();
                            socket.battle = false;
                            if (activeusers[socket.room] === undefined) activeusers[socket.room] = {}; // allocate space in active users object for players data structure
                            activeusers[socket.room][socket.id] = {Name1: rows[0][0].Name1, Name2: rows[0][0].Name2, Name3: rows[0][0].Name3,CellX: rows[0][0].CellX,CellY: rows[0][0].CellY,RoomID: rows[0][0].RoomID, ID: socket.id, Skin: rows[0][0].Skin, HairStyle:rows[0][0].HairStyle,HairColor:rows[0][0].HairColor,ShirtID:rows[0][0].ShirtID,ShoesID:rows[0][0].ShoesID,TrowsersID:rows[0][0].TrowsersID,WepponID:rows[0][0].WepponID,HeadID:rows[0][0].HeadID, Path:[], Quests:rows[1]}; // convert gathered data from database to player data structure
                            socket.emit('PlayerStructure', activeusers[socket.room][socket.id]);
                            socket.broadcast.to(socket.room).emit('AddPlayer', activeusers[socket.room][socket.id]); // same as above
                            if (activeusers[socket.room] === undefined) activeusers[socket.room] = {}; // allocate space in active users object for players data structure
                            if (activerooms[socket.room] === undefined) {
                                Query('SELECT R.Name AS RoomName, R.X AS RoomX, R.Y AS RoomY, Re.Name FROM Rooms as R, Regions as Re, Stats As S WHERE R.RegionID = Re.ID AND R.ID=S.RoomID AND S.ID = "'+socket.id +'"; SELECT M.Collumn AS X, M.Row AS Y, M.Walkable FROM Rooms as R, MatrixCells as M, Stats As S WHERE M.RoomID=R.ID AND R.ID=S.RoomID AND S.ID="'+socket.id +'"; SELECT CASE WHEN C.RoomID1=R.ID THEN C.RoomID2 WHEN C.RoomID2=R.ID THEN C.RoomID1 END as RoomID, CASE WHEN C.RoomID1=R.ID THEN C.Wall1 WHEN C.RoomID2=R.ID THEN C.Wall2 END as Wall, C.Point, C.Battle FROM Rooms as R, Connections as C, Stats as S WHERE (C.RoomID1=R.ID OR C.RoomID2=R.ID) AND R.ID=S.RoomID AND S.ID="'+socket.id +'";', function(rows, fields){
                                    activerooms[socket.room]= GetRoom(rows);
                                    socket.emit('RoomStructure', activerooms[socket.room]);
                                });
                            } else {
                                socket.emit('RoomStructure', activerooms[socket.room]);
                            }
                        });
                    } else {
                        io.sockets.emit('error', socket.id, "No account found <br> Have you signed up? <br> Is your details correct?"); // notify player of and error by sending socket
                    }
                })
            }
        });
    });

我認為 ....

socket.on('login', function (uname, pword, email) {
===>
socket.on('login', function (data) {
// extract uname, pword, email from data
// ex) var jdata = JSON.parse(data); 
// var uname = jdata.uname;
// var pword = jdata.pword;
// var email = jdata.email

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM