gpt4 book ai didi

node.js - Socket.IO 重复消息

转载 作者:可可西里 更新时间:2023-11-01 11:15:09 24 4
gpt4 key购买 nike

我正在尝试使用 Laravel 以及 Node js 服务器、socketio 和 redis 构建聊天应用程序。我所拥有的是:

客户端 JS:

var socket = io('http://localhost:3005');
var room = '17';
$("#send").click(function(){
content = $("textarea").val();
id =$("#id").val();
$.ajax({
url: "{{route('send.message')}}",
method: "POST",
data: {content, id, room},
success: function(){
}
});
});

socket.on('cacad', function(message){
console.log(message); //multiple copies here
});

socket.on('connect', function(){
console.log("Connected!");
socket.emit('room', room);
});

Laravel Controller :

public function sendMessage(Request $request){
event(new EventName($request->all()));
$message = new Message;
$message->message = $request->content;
$redis = LRedis::connection();
$redis->publish('chat-channel', json_encode($request->all()));
$message->save();
}

Node 服务器:

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

var myMessage;
var redis_client = redis.createClient();

redis_client.subscribe('chat-channel');

io.on('connection', function(socket) {

redis_client.on('message', function(channel, message) {
var myData = JSON.parse(message);
socket.broadcast.to('17').emit('cacad', 'u i u a a');
});


socket.on('room', function(room){
socket.join(room);
});

socket.on('disconnect', function(){
console.log("disconnected!");
});
});


http.listen(3005, function() {
console.log('Listening on Port 3005');
});

我正在尝试在 17 号房间广播一条消息 u i u a a。但是当我在控制台中收到它时,它会显示它的多个副本,2x-4x。在 Laravel Controller 中,我使用 redis 发布一条消息,并在 Node 服务器中订阅它。它已成功接收,但问题在于消息的多个副本(客户端)。

请问哪里错了?谢谢:)

最佳答案

我非常确信我找到了问题,尽管我不得不搜索一些关于这些简单 API 用法的信息,因为我最近没有使用该库。

查看 docs它非常清楚地解释了您的问题。

在这里你正在监听一个新的连接,

io.on('connection', function(socket) {

如果客户要求加入特定的房间,你就加入他:

socket.on('room', function(room){
socket.join(room);

到目前为止它就像docs :

io.on('connection', function(socket){
socket.join('some room');
});

但是您的问题在于您的发出,在每个客户端连接上,您都会收听来自您的 redis 的消息。然后,您使用已连接客户端的 emit 将其广播到房间。

除此之外,您还可以这样做:

io.on('connection', function(socket) {
socket.on('room', function(room){
socket.join(room);
});

socket.on('disconnect', function(){
console.log("disconnected!");
});
});

redis_client.on('message', function(channel, message) {
var myData = JSON.parse(message);
io.to('17').emit('cacad', 'u i u a a');
});

关于node.js - Socket.IO 重复消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51430187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com