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.