2016-11-16 51 views
0

我想在node.js和socket.io中創建一個聊天室,但是當我嘗試在他們的消息旁顯示用戶名時,它僅顯示未定義,這裏是我的客戶端代碼socket.username始終顯示爲我的客戶端上的udefined html

的index.html

<html> 
<head> 
<meta name="viewport" content="width=device-width"/> 
<meta name="description" content="BillIsChill-2.0 BETA"> 
<meta name="keywords" content="billischill,Bill,is,chill,2.0,billischill-2.0,gamer-chat,BillIsChill-Underground-Chat,BILLISCHILL,> 
<meta name="author" content="Nik Hendricks"> 
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> 

    <script src="/socket.io/socket.io.js"></script> 
    <title>BillIsChill-2.0</title> 
    <link type="text/css" rel="stylesheet" href="http://billischill.ddns.net/billischill-2.0/css/masterStyle.css" /> 
    <link type="text/css" rel="stylesheet" href="http://billischill.ddns.net/billischill-2.0/css/animate.css" /> 
</head> 
<body> 
    <div id="main-header-div"> 
     <p id="main-header-div-text">BillIsChill-2.0<p> 
     <form> 
      <input id="main-header-div-search-txtinpt" class="search" placeholder="Search" name="search"/> 
     </form> 
    </div> 
     <div id="sidebar-controls-div"> 
      <div id="sidebar-homebutton"> 
        <div class="sidebar-control-img" id="sidebar-homebutton-img"> 
        </div> 
      </div> 
         <div id="Chatrooms-sidebar-button" class="sidebar-control-button"> 
         <div class="sidebar-control-img" id="sidebar-chatroombutton-img"> 
         </div> 
        </div> 
        <div id="avatar-sidebar-button" class="sidebar-control-button"> 
         <div class="sidebar-control-img" id="sidebar-avatarbutton-img"> 
         </div> 
        </div> 

     </div> 


    <div id="chat-rooms-div" class="main-div"> 
      <div id="rooms"> 
      </div> 
    </div> 
    <div id="chat-box-div" class="main-div"> 
    <div id="chatlog-display-div"> 

    </div> 
    <form id="chatform" action=""> 
     <hr id="chat-box-div-hr"> 
     <div id="chat-controls-div"> 
     <input id="chat-box-div-txtinpt" class="big-txtinpt"type="text" spellcheck="false" placeholder="Message"> 
     <input id="chat-box-div-submit" class="submit" type="submit" value="Send"> 
    </div> 
    </form> 
</div> 
<div id="online-users-div"> 
<div> 
    <script> 


    var socket = io(); 

    socket.on('connect', function(){ 
     socket.emit('adduser', prompt("What's your name?")); 
    }); 
    socket.on('updatechat', function (username, data) { 
     $('#chatlog-display-div').append(username + data); 
    }); 
    socket.on('welcomeuser', function(data, username){ 
     jQuery("#chatlog-display-div").append(data + username); 
    }); 
    socket.on('updaterooms', function(rooms, current_room) { 
     $('#rooms').empty(); 
     $.each(rooms, function(key, value) { 
      if(value == current_room){ 
       $('#rooms').append('<div id="chatroom-box"><center>' + value + '<center></div><hr>'); 
       $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
      } 
      else { 
       $('#rooms').append('<div id="chatroom-box"><center><a id="chatroom-box-link" href="#" onclick="switchRoom(\''+value+'\')">' + value + '</a></center></div><hr>'); 
       $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
      } 
     }); 
    }); 
    function switchRoom(room){ 
     socket.emit('switchRoom', room); 
    } 




    $('form').submit(function(e) { 
    e.preventDefault(); 




    //right here is were i started changin it 

      //gets the value from the message text feild and sets it as the message var 
    var message = { 
      text : $('#chat-box-div-txtinpt').val() 
      } 
     if (message.text.trim().length !== 0) { 
         socket.emit('chat-message',message); 
       //append the message to the chatlog-display-div 
       $('#chat-box-div-txtinpt').focus().val(''); 
       jQuery("#chatlog-display-div").append('<div><b>'+socket.username+':</b>&nbsp'+message.text+'</div><hr>'); 
          $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
      } 
         }); 
      socket.on('chat-message', function (message) { 
      jQuery("#chatlog-display-div").append('<div><b>'+socket.name+':</b>&nbsp'+message.text+'</div><hr>'); 
         $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
      }); 

       var something = document.getElementById('sidebar-homebutton'); 

       something.style.cursor = 'pointer'; 
       something.onclick = function() { 
       window.location.href = "http://billischill.ddns.net"; 

       }; 

    </script> 

,這裏是我的服務器代碼

index.js

var mysql = require("mysql"); 
var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var usernames = {}; 
var rooms = ['General-Chat','Tech-Chat','Gamer-Chat',"BillIsChill-Underground-Chat","Programer-Chat","Hacker-Chat","Minecraft-Chat","Gta-Chat","Misc-Chat","Current-Events-Chat"]; 



app.get('/', function(req, res){ 
    res.sendfile('index.html'); 
    //res.sendfile('/login/'); 
}); 
http.listen(8080, function(){ 
    console.log('listening on *:8080'); 
}); 

var con = mysql.createConnection({ 
    host: "localhost", 
    user: "root", 
    password: "password", 
    database: "messages" 
}); 
io.on('connection', function (socket) { 
    socket.on('adduser', function(username){ 
    socket.username = username; 
    socket.room = 'General-Chat'; 
    usernames[username] = username; 
    socket.join('General-Chat'); 
    socket.broadcast.to('General-Chat').emit('updatechat', '<b class="servertxt">SERVER: </b>', socket.username + ' has connected to this room' + '<hr>'); 
    socket.emit('welcomeuser', '<b class="servertxt">SERVER:</b> Welcome ', socket.username + '<hr>'); 
    socket.emit('updaterooms', rooms, 'room1'); 
}); 
socket.on('switchRoom', function(newroom){ 
    socket.leave(socket.room); 
    socket.join(newroom); 
    socket.emit('updatechat', '<b class="servertxt"> SERVER </b>', 'you have connected to '+ newroom + '<hr>'); 
    // sent message to OLD room 
    socket.broadcast.to(socket.room).emit('updatechat', '<b class="servertxt"> SERVER </b>', socket.username+' has left this room <hr>'); 
    // update socket session room title 
    socket.room = newroom; 
    socket.broadcast.to(newroom).emit('updatechat', '<b class="servertxt"> SERVER </b>', socket.username+' has joined this room <hr>'); 
    socket.emit('updaterooms', rooms, newroom); 
}); 
    console.log('a user connected'); 
    socket.on('disconnect', function(){ 
    // remove the username from global usernames list 
    delete usernames[socket.username]; 
    // update list of users in chat, client-side 
    io.sockets.emit('updateusers', usernames); 
    socket.leave(socket.room); 
}); 
    socket.on('chat-message', function (message) { 
    console.log('message:', socket.username+': ' + message.text); 

var insert = { roomName: socket.room, username: socket.username, message: message.text }; 

//puts message in db 
con.query('INSERT INTO messages SET ?', insert, function(err,res){ 
    if(err) throw err; 

    console.log('Last insert ID:', res.insertId); 
}); 
//excludes "socket" from getting the emit 
     socket.broadcast.to(socket.room).emit("chat-message", message); 
    }); 
}); 

能有人爲請幫助我,我在這裏發生了什麼

回答

0

您的客戶端代碼有一些小錯誤,我會嘗試做一些改變,

server.js:

socket.on('chat-message', function (user, message) { 
    console.log('message:', user + ': ' + message.text); 
    var insert = { roomName: socket.room, username: user, message: message.text }; 
    //puts message in db 
    con.query('INSERT INTO messages SET ?', insert, function(err,res){ 
    if(err) throw err; 
     console.log('Last insert ID:', res.insertId); 
    }); 
    //excludes "socket" from getting the emit 
    socket.broadcast.to(socket.room).emit("chat-message", user, message); 
    }); 

在客戶端:

<html> 
     <head> 
     <meta name="viewport" content="width=device-width"/> 
     <meta name="description" content="BillIsChill-2.0 BETA"/> 
     <meta name="keywords" content="billischill,Bill,is,chill,2.0,billischill-2.0,gamer-chat,BillIsChill-Underground-Chat,BILLISCHILL"/> 
     <meta name="author" content="Nik Hendricks"> 
     <script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
     <script src="/socket.io/socket.io.js"></script> 
     <title>BillIsChill-2.0</title> 
     <link type="text/css" rel="stylesheet" href="http://billischill.ddns.net/billischill-2.0/css/masterStyle.css" /> 
     <link type="text/css" rel="stylesheet" href="http://billischill.ddns.net/billischill-2.0/css/animate.css" /> 
     </head> 
     <body> 
     <div id="main-header-div"> 
      <p id="main-header-div-text">BillIsChill-2.0<p> 
      <form> 
       <input id="main-header-div-search-txtinpt" class="search" placeholder="Search" name="search"/> 
      </form> 
     </div> 
     <div id="sidebar-controls-div"> 
      <div id="sidebar-homebutton"> 
      <div class="sidebar-control-img" id="sidebar-homebutton-img"> </div> 
      </div> 
     <div id="Chatrooms-sidebar-button" class="sidebar-control-button"> 
      <div class="sidebar-control-img" id="sidebar-chatroombutton-img"></div> 
     </div> 
      <div id="avatar-sidebar-button" class="sidebar-control-button"> 
      <div class="sidebar-control-img" id="sidebar-avatarbutton-img"></div> 
      </div> 
     </div> 
     <div id="chat-rooms-div" class="main-div"> 
      <div id="rooms"></div> 
     </div> 
     <div id="chat-box-div" class="main-div"> 
      <div id="chatlog-display-div"></div> 
      <form id="chatform" action=""> 
      <hr id="chat-box-div-hr"> 
      <div id="chat-controls-div"> 
      <input id="chat-box-div-txtinpt" class="big-txtinpt"type="text" spellcheck="false" placeholder="Message"> 
      <input id="chat-box-div-submit" class="submit" type="submit" value="Send"> 
      </div> 
     </form> 
     </div> 
     <div id="online-users-div"><div> 

     <script> 
     var socket = io(); 

     socket.on('connect', function() { 
      var user = prompt("What's your name?"); 
      socket.username = user; 
      socket.emit('adduser', user); 
     }); 

     socket.on('updatechat', function (username, data) { 
      $('#chatlog-display-div').append(username + data); 
     }); 

     socket.on('welcomeuser', function(data, username){ 
      jQuery("#chatlog-display-div").append(data + username); 
     }); 

     socket.on('updaterooms', function(rooms, current_room) { 
      $('#rooms').empty(); 
      $.each(rooms, function(key, value) { 
       if(value == current_room){ 
        $('#rooms').append('<div id="chatroom-box"><center>' + value + '<center></div><hr>'); 
        $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
       } 
       else { 
        $('#rooms').append('<div id="chatroom-box"><center><a id="chatroom-box-link" href="#" onclick="switchRoom(\''+value+'\')">' + value + '</a></center></div><hr>'); 
        $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
       } 
      }); 
     }); 
     function switchRoom(room){ 
      socket.emit('switchRoom', room); 
     } 

     $('form').submit(function(e) { 
      e.preventDefault(); 
      //right here is were i started changin it 
      //gets the value from the message text feild and sets it as the message var 
      var message = { 
      text : $('#chat-box-div-txtinpt').val() 
      } 
      if (message.text.trim().length !== 0) { 
      socket.emit('chat-message', socket.username, message); 
      //append the message to the chatlog-display-div 
      $('#chat-box-div-txtinpt').focus().val(''); 
      jQuery("#chatlog-display-div").append('<div><b>'+socket.username+':</b>&nbsp'+message.text+'</div><hr>'); 
      $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
      } 
     }); 

     socket.on('chat-message', function (user, message) { 
      jQuery("#chatlog-display-div").append('<div><b>'+ user + ':</b>&nbsp'+message.text+'</div><hr>'); 
      $("#chatlog-display-div").scrollTop($("#chatlog-display-div").prop("scrollHeight")); 
     }); 

     </script> 
    </body> 
    </html> 

請讓我知道它是否適合你。

+0

它沒有工作對我來說 –

+0

請告訴我更多關於這個問題的信息。這段代碼適合我。讓我們來看看發生了什麼 – mk12ok

+0

對不起,我想知道是否有可能把代碼放在用戶的消息到server.js這樣的方式socket.username變量將可用....如果有什麼意義 –

0

socket.username是不確定的確實(在客戶端)很困惑。我猜你在服務器端定義了socket.username,但這兩個套接字對象不是同一個。你可以試試這個:

socket.on('connect', function(){ 
    var username = prompt("What's your name?"); 
    socket.username = username; 
    socket.emit('adduser', username); 
}); 

它可能工作;)

+0

感謝它的作品,但它顯示您的名字爲每個消息 我可以設置我的名字史蒂夫然後說你好所有,它會顯示在我的窗口'史蒂夫:你好',然後somone其他可以設置那裏的名字作爲法案,可以說我很酷,它會在我的屏幕上顯示出這樣'史蒂夫我很酷',並在那裏屏幕上它會顯示'條例草案你好'和'條例草案我很酷',你可以請幫忙 –