在发送方显示聊天消息两次向其他人显示

时间:2018-03-15 06:31:56

标签: node.js laravel redis

我正在使用laravel + socet.io + redis开发聊天应用程序,我使用MYSQL进行商店聊天消息。

所有流程都正常运行。但我面临一个麻烦。 就是这样,

当发件人向聊天室发送消息时,该消息首先存储数据库,然后该消息转到其他客户端认为redis事件。

因此,在这种情况下,一封邮件在发件人侧窗口重复两次。其他客户聊天室工作正常。 下面我为发送者和接收者侧窗口附上两张图片。(*他们在同一个聊天室)

Sender side window

Receiver side window

这是我的HTML,redis + nodeserver编码部分

<html>
  <body>

   <div id="data">
     @foreach($messages as $message)
     <p id="{{$message->id}}">database_<strong>{{$message->Sender}}
   </strong>: 
     {{$message->MessageTxt}}</p>
     @endforeach
   </div>

  <div>
  <form action="sendMessaged" method="POST">
{{csrf_field()}}
Name: <input type="text" name="Sender">
<br>
<br>
Content: <textarea name="MessageTxt" rows="5" style="width:100%">
</textarea>
<button type="submit" name="send">Send</button>
 </form>

                  

 <script>
    var socket = io('http://localhost:6001');
     socket.on('chat:message',function(data){
      console.log(data)       

       if($('#'+data.id).length == 0){
        $('#data').append('<p>else__<strong>'+data.Sender+'</strong>: '+data.MessageTxt+'</p>')
    }
    else{

    }
});     

    var io = require('socket.io')(6001);
    console.log('Connected to port 6001');
    io.on('error',function(socket){
    console.log('error')
    });
var Redis = require('ioredis');
var redis = new Redis(1000);
 redis.psubscribe("*",function(error,count){
});

io.on('connection',function(socket){
 console.log('coonected with'+socket.id)
});
redis.on('pmessage',function(partner,channel,message){

message = JSON.parse(message);
socket.emit(channel+":"+message.event,message.data.message);
console.log('Sent')
});

1 个答案:

答案 0 :(得分:1)

将此行更改为

socket.emit(channel+":"+message.event,message.data.message);

到此

socket.broadcast.emit(channel+":"+message.event,message.data.message);

为了您的信息,我列出了所有可能的场景

仅发送给发件人 - 客户

socket.emit(channel+":"+message.event,message.data.message);

发送给所有客户,包括发件人

io.emit(channel+":"+message.event,message.data.message);

发送给游戏中的所有客户&#39;房间(频道),发件人除外

socket.broadcast.to('game').emit(channel+":"+message.event,message.data.message);

发送给游戏中的所有客户&#39;房间(频道),包括发件人

io.in('game').emit(channel+":"+message.event,message.data.message);
发送给发件人客户端,只有当他们在游戏中时才会发送给客户。室(信道)

socket.to('game').emit(channel+":"+message.event,message.data.message);

发送给名称空间&#39; myNamespace&#39;中的所有客户,包括发件人

io.of('myNamespace').emit(channel+":"+message.event,message.data.message);

发送给个人socketid

socket.broadcast.to(socketid).emit(channel+":"+message.event,message.data.message);

希望这有帮助