Foros del Web » Programando para Internet » Node.js »

[SOLUCIONADO] Mensajes duplicados en chat Nodejs, redis y socket.io

Estas en el tema de Mensajes duplicados en chat Nodejs, redis y socket.io en el foro de Node.js en Foros del Web. Hola buenas tardes, vengo a pedir una ayuda con un problema que estoy teniendo a la hora de enviar un mensaje privado a traves de ...
  #1 (permalink)  
Antiguo 29/05/2018, 12:26
 
Fecha de Ingreso: noviembre-2009
Mensajes: 89
Antigüedad: 14 años, 5 meses
Puntos: 1
Exclamación Mensajes duplicados en chat Nodejs, redis y socket.io

Hola buenas tardes, vengo a pedir una ayuda con un problema que estoy teniendo a la hora de enviar un mensaje privado a traves de Node.js, Redis y Socket.io, les dejo el código.

Este es mi server.js

Código Javascript:
Ver original
  1. var redis   = require('../node_modules/redis');
  2. var socket  = require('../node_modules/socket.io' );
  3. var express = require('../node_modules/express');
  4. var app     = express();
  5. var server  = require('http').createServer(app);
  6. var io      = socket.listen( server );
  7. var port    = process.env.PORT || 3002;
  8.  
  9. let sequenceNumberByClient = new Map();
  10.  
  11. server.listen(port, function () {
  12.   console.log('Server listening at port %d', port);
  13. });
  14.  
  15.  
  16. io.on('connection', function (socket) {
  17.  
  18.   socket.on('channel', (channel) => {
  19.      redisClient.subscribe(channel);
  20.    })
  21.  
  22.   var redisClient = redis.createClient();
  23.  
  24.   sequenceNumberByClient.set(socket, 1);
  25.  
  26.   redisClient.on("message", function(channel, data) {
  27.     socket.emit(channel, data);
  28.   });
  29.  
  30.   socket.on('disconnect', function() {
  31.     sequenceNumberByClient.delete(socket);
  32.     redisClient.quit();
  33.   });
  34.  
  35. });

mi código del cliente


Código Javascript:
Ver original
  1. <script>
  2.     var socket = io.connect('http://localhost:3002');
  3.       $('.usuarios').on('click', '.users-to', function() {
  4.           $("#messages").empty ();
  5.           channel = $(this).val()+''+{{ \Auth::user()->id }};
  6.           var token_messages = '{{ csrf_token() }}';
  7.           var user_to = $(this).val();
  8.  
  9.           $.ajax({
  10.                 type: "POST",
  11.                 url: '{!! URL::to("getmessages") !!}',
  12.                 dataType: "json",
  13.                 data: {'_token':token_messages, 'userTo':user_to},
  14.                 success:function(data){
  15.                    
  16.                     $.each(data.messageList, function (index, value) {
  17.                       class_msg = '';
  18.                       if(value.user_to == {{ \Auth::user()->id }} )
  19.                       {
  20.                         class_msg = 'replies';
  21.                       }else{
  22.                         class_msg = 'sent';
  23.                       }
  24.                       $( "#messages" ).append( "<li class='"+class_msg+"'><img src='http://emilcarlsson.se/assets/mikeross.png' alt=''/><p>"+value.name+": "+value.message+"</p></li>" );
  25.                     });
  26.  
  27.                 }
  28.  
  29.             });
  30.  
  31.           socket.emit('channel', channel);
  32.           setChannel(channel);
  33.  
  34.       });
  35.  
  36.  
  37.       function setChannel(channelValue){
  38.  
  39.       socket.on(channelValue, function (data) {
  40.           data = jQuery.parseJSON(data);
  41.           $( "#messages" ).append( "<li class='sent'><img src='http://emilcarlsson.se/assets/mikeross.png' alt=''/><p>"+data.user+": "+data.message+"</p></li>" );
  42.       });
  43.       }
  44.    
  45.     $(".send-msg").click(function(e){
  46.         e.preventDefault();
  47.         var token = '{{ csrf_token() }}';
  48.         var user = $("input[name='user']").val();
  49.         var msg = $(".msg").val();
  50.         var user_to = {{ $user->id }};        
  51.         if(msg != ''){
  52.             $.ajax({
  53.                 type: "POST",
  54.                 url: '{!! URL::to("sendmessage") !!}',
  55.                 dataType: "json",
  56.                 data: {'_token':token,'message':msg,'user':user, 'userTo':user_to, 'channel': channel},
  57.                 success:function(data){
  58.                     console.log(data);
  59.                     console.log(data.user);
  60.                     $(".msg").val('');
  61.                 }
  62.             });
  63.         }else{
  64.             alert("Please Add Message.");
  65.         }
  66.     })
  67. </script>

Y este mi controlador en Laravel

Código PHP:
Ver original
  1. public function sendMessage(Request $request)
  2.     {
  3.         try {
  4.  
  5.         $redis = LRedis::connection();
  6.  
  7.         $chatRepo = new ChatRepo();
  8.         $message  = $request->message;
  9.         $userTo   = $request->userTo;
  10.         $user_ex  = explode('-', $request->user);
  11.         $user_id  = (int)end($user_ex);
  12.         $user     = $user_ex[0];
  13.         $userFrom = \Auth::user()->id;
  14.         $status   = 1;
  15.         $key      = \Uuid::generate(4)->string;
  16.         $read     = 0;
  17.  
  18.         $chatMessage = $chatRepo->createChatMessage($userFrom, $userTo, $message, $status, $key, $read);
  19.  
  20.         $data = ['message' => $message, 'user' => $user];
  21.  
  22.         $channel = $request->channel;
  23.  
  24.         $redis->publish($channel, json_encode($data));
  25.  
  26.         return response()->json($data, 200);
  27.         } catch (\Exception $ex) {
  28.             \Log::error('ChatController.sendMessage', ['exception' => $ex]);
  29.             return redirect()->back()->with('error_string', _('Ha ocurrido un error.'));
  30.         }
  31.        
  32.     }


El error que tengo es que cuando le doy click sobre un usuario para enviarle el mensaje, si le doy click 2 o mas veces a ese usuario, o cambio de un usuario a otro, se me duplican los mensajes que envío tantas veces haga click en los botones de usuario. Espero me puedan ayudar feliz tarde.

Última edición por snowdogs; 29/05/2018 a las 12:35 Razón: No se guarda completo

Etiquetas: chat, duplicados, mensajes, socket-io
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:42.