2015-04-29 3 views
13

In 0.9.16, utilizzo socket.emit con callback in modo che il server di chat restituisca alcuni dati e possa gestire il risultato come da riconoscimento. Ma dopo l'aggiornamento a 1.3.5 Ho trovato un errore nella console come questoL'emissione SocketIO con callback non riesce durante l'aggiornamento da 0.9.16 a 1.3.5

Uncaught TypeError: Cannot read property 'apply' of undefined.

ho fatto qualcosa di simile,

Dal web

socket.emit('userToUser', { 'usename': 'John', 
'message': 'hi' 
}, function(callback){ 
//callback handled 
}); 

Chat Server

socket.on('userToUser', function(content, callback){ 
//do something 
if(callback) return callback({'result':'success', 'messageid':content.messageid, 'chatid':content.chatid}); 
}); 

Quando ho rimosso la richiamata dal lato client, non ci sono errori. Quindi credo che ci saranno alcune modifiche da fare nel callback.

sto ottenendo il riconoscimento e la chat funziona correttamente, ma la mia preoccupazione è sull'errore console che porta a socketio.js

Socket.prototype.onack = function(packet){ 
    debug('calling ack %s with %j', packet.id, packet.data); 
    var fn = this.acks[packet.id]; 
    fn.apply(this, packet.data); 
    delete this.acks[packet.id]; 
}; 

Ragazzi, per favore aiutatemi

risposta

6

Infine ho risolto il problema. È stato un errore nel mio codice, ho fatto più callback nel server di chat. come questo:

socket.on('userToUser', function(content, callback){ 

    mysql.insertChat(content, function(err, data){ 
     return callback({'result':'1'}) //first callback 
    }) 
    sendToUser(content, function(errm successData){ 
     return callback({'result':'success','chatid':content.chatid}); 
     //second callback ->wrong 
    }) 

}); 

In the previous versions it was a warning, now its an error !! That's it. So please avoid multiple callbacks

prega di dare un'occhiata a questo e potrebbe essere utile per ogni nodejs sviluppatore: ragazzi http://www.toptal.com/nodejs/top-10-common-nodejs-developer-mistakes/#remote-developer-job

Grazie per upvoting!

+1

"Grazie ragazzi per l'upvoting!" lol you – Foreever

+1

Solo una FYI ha funzionato prima a causa di una perdita di memoria in Socket.IO 0.9.x - I gestori non venivano mai ripuliti correttamente (e quindi perdevano memoria e rendevano effettivamente vulnerabile il tuo server/client per gli attacchi) che ti permettevano di chiamare continuamente il callback. – 3rdEden

0

EDIT: Questo non è il modo in cui i callback funzionano con socket.io v1.3.5. In effetti, la funzione emit non accetta affatto callback.

Suppongo che vogliate inviare una conferma allo inviando il nodo che il suo messaggio è stato ricevuto. Per ottenere ciò, è necessario effettuare un'altra chiamata socket.emit dal server (sul server, la variabile socket rappresenta la connessione a un nodo specifico nella rete mentre sul client, la variabile socket rappresenta la connessione al server) . Di conseguenza, sul client, è necessario gestire la conferma con uno socket.on che è dove si inserirà la richiamata.

Per trasmettere il riconoscimento a TUTTI i nodi della rete, è necessario utilizzare io.emit.

Esempio di codice per un'applicazione di chat tramite socket.io disponibile here.

+0

Penso che tu abbia torto, perché callback del supporto socketio, vedi questo socket.io/docs/#sending-and-getting-data-(acknowledgements) –

+1

Scuse! Mancava quella parte ... – nilakshdas

Problemi correlati