Nodejs n’a pas pu envoyer de message à un soket spécifique en ligne

J’essaie d’implémenter une notification push simple basée sur socket.io, dans mon code simple pour m’entraîner, comment puis-je le faire? J’ai écrit un code simple, dans mon code, je ne peux pas envoyer de message à un utilisateur connecté. stocker socket.io avec la clé sur redis , mais lors de l’envoi d’un message à l’utilisateur, j’obtiens la clé sous le nom d’utilisateur de redis et la valeur socket.io enregistrée de redis et j’essaie d’envoyer, je reçois la même valeur socket.io mais le message ne le fait pas envoyer à l’utilisateur

côté client:

      Document      $(document).ready(function () { $('#login').click(function () { socket.emit('login', {username: 'a', password: 'a'}); }); $('#mesage').click(function () { socket.emit('message', 'a'); }); });   var socket = new io.connect('http://192.168.1.35:3000', { port : 3000, transports: ['websocket'] }); socket.on('connect', function () { console.log('connected!'); }); socket.on('login', function (message) { console.log(message); }); socket.on('message', function (message) { console.log(message); }); socket.on('hello,', function (message) { console.log(message); }); socket.on('success', function (data) { console.log(data); });    

login

mesage

du côté serveur:

 var socket = require('socket.io'), express = require('express'), app = express(), server = require('http').createServer(app), io = socket.listen(server), port = process.env.PORT || 3000, redis = require("redis"), redisClient = redis.createClient(); socket.on('connection', function (socket) { socket.on('login', function (data) { login(data.username, data.password, function (success, value) { if (success) { redisClient.exists(data.username, function (err, doesExist) { if (err) return; if (!doesExist) { redisClient.set(data.username, socket.id); } else { redisClient.del(data.username); redisClient.set(data.username, socket.id); } log.info("SOCKET ID: " + socket.id); }); socket.emit('login', {result: success, id: socket.id}); } else { socket.emit('login', {result: false, id: socket.id}); } }); }); socket.on('message', function (username) { redisClient.get(username, function (err, socketId) { if (err) socket.emit('message', err); io.to(socketid).emit('message', 'for your eyes only'); }); }); }); 

quand je clique sur login j’obtiens ce résultat

  Object { result=true, id="/#A5sR-Xo-Owo97NvRAAAB"} 

et quand je clique sur le message, j’obtiens ce résultat:

 user not connected /#A5sR-Xo-Owo97NvRAAAB 

Les deux socket.id de socket.id sont identiques, mais le client ne reçoit aucun message et le serveur renvoie ce message en tant user not connected

Il semble que vous ayez une faute de frappe dans ce code:

 redisClient.get(username, function (err, socketId) { if (err) socket.emit('message', err); io.to(socketid).emit('message', 'for your eyes only'); }); 

Votre rappel reçoit socketId comme second argument, mais vous utilisez socketid (minuscule) lorsque vous envoyez un message.

En outre, il est préférable de quitter une fonction lorsque vous envoyez un message d’erreur:

 if (err) return socket.emit('message', err); 

ou:

 if (err) { socket.emit('message', err); return; } 

sinon, vous pourriez avoir des erreurs inattendues.

J’espère que cela t’aides.