2017-05-03 78 views
0

我是新来的nodeJS,我试图构建一个聊天应用程序。我的想法是,当用户点击一个名字时,他将能够与该用户聊天。 我使用MongoDB来保持socket.id提供的用户名和他们的id。 这是我的代码:socket.broadcast.to(id).emit()无法正常工作,但socket.broadcast确实

文件index.html位于“public”目录中。

index.html,函数start()在jquery之外,因为它不想像那样工作。

<!DOCTYPE html> 
<html lang="en"> 
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> 
    <script src="/socket.io/socket.io.js"></script> 

<head> 
    <meta charset="UTF-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible" content="ie=edge"> 
    <link rel="stylesheet" href="style.css"> 
    <title>Document</title> 
    <link href="/favicon.ico" type="image/x-icon" rel="icon" /> 

</head> 
<body> 
    <h1>Tchat</h1> 
    <div class="inscrire"> 
    <form action="" id="form"> 
    <input type="text" placeholder="Enter your name" id="username"> 
    <input type="submit"> 
    </form> 
    </div> 

    <div id="container"> 

    <div id="userList"> 

    </div> 

    <div class="chat" id="chat"> 
     <div class="chatHeader" id="chatHeader"></div> 
     <div class="messages"> </div> 
    <div> 
     <form action="" id="send"> 
     <textarea name="name" rows="8" cols="80" id="message"></textarea> 
     <input type="submit" value="envoyer"> 
     </form> 
    </div> 

    </div> 


    </div> 
<script> 
var socket = io(); 

var $currentUser; 

function start(id, name){ 
    document.getElementById("chat").style.display = "block"; 
    document.getElementById("chatHeader").innerHTML = name; 
    socket.emit('startchat', id, $currentUser); 
} 


$(document).ready(function(){ 
    $('#container').hide(); 

//partie users 
    function username(){ 
    var username = $("#username").val(); 

    if(username !== ''){ 
     $currentUser = username; 
     socket.emit('new user',{user: username}); 
     $("#username").val(''); 
     $('#form').hide(); 
     return true; 
     } 
    else{ 
     return false; 
    } 

    } 

$('.inscrire').submit(function(event){ 
    event.preventDefault(); 
     if(username()){ 
    $('#container').show(); 
    $('.chat').hide(); 
    } 

}); 

//display users 
socket.on('userName', function(data){ 
    for(var i = 0; i < data.length; i++){ 
    if(data[i].name != $currentUser){ 
     $('#userList').append('<li onClick="start(\'' + data[i].socketId + '\''+','+'\'' + data[i].name + '\')">'+ data[i].name + '</li>'); 
     } 
    } 
}); 


//msg part 
$('#send').submit(function(event){ 
    event.preventDefault(); 
    var msg = $("#message").val(); 
    socket.emit('message',msg); 
    $("#message").val(''); 
}); 

socket.on('msg', function(data){ 
    alert(data); 
}); 
}); 

</script> 



</body> 
</html> 

server.js

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

var mongo = require('mongodb').MongoClient; 


app.use(express.static('public')); 

mongo.connect('mongodb://127.0.0.1/chat', function(err,db){ 
    if(err) throw err; 
    console.log('connected to database'); 

    io.on('connection', function(socket){ 
    socket.on('new user', function(data){ 
     db.collection('users').find({"name":data.user}).count().then(function(numItems) { //to avoid the Promise<spending> mistake 
     if(numItems == 0){ 
      db.collection('users').insertOne(
      {"name": data.user, 
       "socketId": socket.id} 
      ); 
      console.log('data inserted'); 
      callback(); 
     } 
     else{ 
      console.log('data already inserted'); 
      callback(); 
     } 

     }); 
     //envoyer le nom du user pour l'afficher 
     db.collection('users').find().toArray(function(err,res){ 
     if(err) throw err; 
     socket.emit('userName', res); 
     }); 

    }); 
//partie msg 

socket.on('startchat', function(id, name){ 
    socket.on('message', function(data){ 
    console.log(data); 
    socket.broadcast.to(id).emit('msg', data); 

    }); 
}); 


    }); 



}); 





http.listen('3000', function(){ 
    console.log('server is listening on port 3000'); 
}); 

我想要的用户时,由其他用户发送消息提醒,但没有奏效。如果我使用socket.broadcast.emit('msg',data)和socket.broadcast.to(id).emit('msg',data),那也不起作用。我究竟做错了什么?

回答

0

我的代码没有错误。由于随机生成的socket.id不起作用,所以在每个新连接中,用户的id都会改变。这就是为什么socket.broadcast.to(id).emit()不起作用。