【发布时间】:2018-08-23 21:02:57
【问题描述】:
我正在使用 laravel+socet.io+redis 开发一个聊天应用程序,并且我使用 MYSQL 来存储聊天消息。
所有进程都正常运行。但我面临一个麻烦。 也就是说,
当发件人向聊天室发送消息时,该消息首先存储数据库,然后该消息转到其他客户端认为 redis 事件。
因此,在这种情况下,一条消息在发送方窗口重复两次。其他客户聊天室正常工作。 下面我附上发送方和接收方窗口的两张图片。(*它们在同一个聊天室)
这是我的 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')
});
【问题讨论】:
-
您必须在客户端执行此操作,因为两者之间涉及代理
-
我实现了一个 API 用于连接到客户端。所以我如何处理它