Reputation: 778
I am trying to log username of logged in users by connecting socket.io to passport.js using passport.socketio. It is successful however it logs the username twice and after trying and searching for a fair amount of time I am stuck.
The code sections are as follows:
The Server Code:
var server = http.createServer(app);
var io = require('socket.io')(server);
io.use(passportSocketIo.authorize({
cookieParser: cookieParser, // the same middleware you registred in express
key: 'connect.sid', // the name of the cookie where express stores its session_id
secret: 'hello', // the session_secret to parse the cookie
store: new (require("connect-mongo")(Esession))({
url: "mongodb://localhost/local"
}), // we NEED to use a sessionstore. no memorystore please
success: onAuthorizeSuccess, // *optional* callback on success - read more below
fail: onAuthorizeFail, // *optional* callback on fail/error - read more below
}));
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
accept(null, true);
accept();
}
function onAuthorizeFail(data, message, error, accept){
if(error)
throw new Error(message);
console.log('failed connection to socket.io:', message);
// We use this callback to log all of our failed connections.
accept(null, false);
// OR
// If you use [email protected] the callback looks different
// If you don't want to accept the connection
if(error)
accept(new Error(message));
// this error will be sent to the user as a special error-package
// see: http://socket.io/docs/client-api/#socket > error-object
}
io.on('connection', function(socket) {
var userID = socket.request.user;
console.log(userID.tg+ " has connected")
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
server.listen(port);
The Client Code
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
</script>
The output is as follows:
successful connection to socket.io
UserName has connected
UserName has connected
I am unsure as to why it is outputting twice any help would be much appreciated. I am relatively new to Node.js but I don't believe it's the passport part that is causing it, however I am stuck so I might not have the best idea.
Thanks in Advanced
EDIT: Tried the latest version of socket and checked my own version both seem to be latest versions, Just to make sure I updated the client code to:
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="https://cdn.socket.io/socket.io-1.3.2.js"></script>
<script>
var socket = io.connect();
</script>
the issue persists
Upvotes: 2
Views: 8971
Reputation: 778
I found the problem which I guess was my own stupidity,
I was accepting the connection twice upon successful authorization. Hence it was registering everything twice the correction should be:
function onAuthorizeSuccess(data, accept){
console.log('successful connection to socket.io');
//accept(null, true); -> remove this line
accept();
}
Upvotes: 4
Reputation: 14226
This apparently was an error in previous version. You probably just need to upgrade. Check out the issue below. https://github.com/Automattic/socket.io/issues/350
In the future, if you're trying to debug an issue like this it's useful to be acquainted with the Node Events Class Documentation. io
is just an event listener, and what's happening here is for SOME reason the connection
event is doing double duty.
It's probably some Socket.io code that is firing emit('connection')
one too many times.
When I'm debugging stuff like this, calling emitter.listeners('event')
can be useful because it will tell me who, and more importantly how many listeners are listening.
So in your case, io.listeners('connection');
will give you an array of everyone who's listening to that event. Obviously, io
is registering it twice, but you can probably find out where with this trick.
Also, going into the package itself and grepping for emit('connection');
will show you just where that nasty bug is.
Upvotes: 1