【问题标题】:socket.broadcast.to(id).emit() doesn't work but socket.broadcast doessocket.broadcast.to(id).emit() 不起作用,但 socket.broadcast 起作用
【发布时间】:2017-10-01 20:08:36
【问题描述】:

我是 nodeJS 的新手,我正在尝试构建一个聊天应用程序。我的想法是,当用户点击一个名字时,他将能够与该用户聊天。 我使用 MongoDB 来保存 socket.id 提供的用户名和他们的 id。 这是我的代码:

文件 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),那也不起作用。我做错了什么?

【问题讨论】:

    标签: jquery node.js sockets


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 2019-12-18
      • 1970-01-01
      • 2016-08-08
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      相关资源
      最近更新 更多