-
-
Save mikermcneil/6598661 to your computer and use it in GitHub Desktop.
module.exports = { | |
/** | |
* | |
* Using raw socket.io functionality from a Sails.js controller | |
* | |
*/ | |
index: function (req,res) { | |
var socket = req.socket; | |
var io = sails.io; | |
// emit to all sockets (aka publish) | |
// including yourself | |
io.sockets.emit('messageName', {thisIs: 'theMessage'}); | |
// broadcast to a room (aka publish) | |
// excluding yourself, if you're in it | |
socket.broadcast.to('roomName').emit('messageName', {thisIs: 'theMessage'}); | |
// emit to a room (aka publish) | |
// including yourself | |
io.sockets.in('roomName').emit('messageName', {thisIs: 'theMessage'}); | |
// Join a room (aka subscribe) | |
// If you're in the room already, no problem, do nothing | |
// If the room doesn't exist yet, it gets created | |
socket.join('roomName'); | |
// Leave a room (aka unsubscribe) | |
// If you're not in the room, no problem, do nothing | |
// If the room doesn't exist yet, no problem, do nothing | |
socket.leave('roomName'); | |
// Get all connected sockets in the app | |
sails.io.sockets.clients(); | |
// Get all conneted sockets in the room, "roomName" | |
sails.io.sockets.clients('roomName'); | |
} | |
}; |
I agree with damassi
I've been racking my brain on this and I'm certain I am missing something here.
In my controller, I am trying to join (create) a room... Should be easy, right?
index: function (req, res) {
var socket = req.socket;
var io = sails.io;
socket.join('roomName');
}
and I get:
TypeError: Object #<Socket> has no method 'join'
Is there something somewhere else that I need to do?
same problem occurs with me
I found the solvent that the above problem.
To use the socket.join
method, there seems to be a need to send a request with WebSocket.
// api/controllers/TestController.js
module.exports = {
join: function(req, res) {
var room = req.param('room');
// If request from WebSocket, this method is exist.
req.socket.join(room);
res.json({
success: true
});
}
};
// client
socket.get('/test/join', {
room: 'test'
}, function(response) {
// do something
});
Thanks for posting this mikermcneil!
this is awesome. Thanks
Took me a while to find this, but jeez it's so nice ! thanks !
agree with damassi 👍
I got the same error as @steveostudios. Is something missing?
Edit : Note: req.socket is only valid if the action is triggered via a socket request, e.g. socket.get('/subscribeToFunRoom/someRoomName')
From : https://github.com/balderdashy/sails-docs/blob/master/reference/Sockets/sails.sockets.join.md
Thanks, this really helps !!! Also, how would you trigger the broadcast to a room from outside of a controller ?
For instance, I'd like to broadcast a message to a particular room each time an external process create a new record in the db (I use mongo-watch in a sails service to be alerted of those record creation). Depending upon the type of record that is created, the room to broadcast to is different.
I understand that
socket.broadcast.to('roomName').emit('messageName', {thisIs: 'theMessage'});
can only be done from within the controller, but is there a way from a sails service (where you do not have access to the incoming request) to emit a message to the corresponding room ? (I am using sails 0.9.16).
Thanks man, so helpful.
Agreed @damassi. The docs regarding sockets are a bit lacking.
The resources I found when researching sockets, sessions and Sails.js:
Socket basics
- http://stackoverflow.com/questions/22454809/emitting-socket-io-event-from-sails-js-and-handling-it-on-server-using-sails-js
- http://irlnathan.github.io/sailscasts/blog/2013/10/10/building-a-sails-application-ep21-integrating-socket-dot-io-and-sails-with-custom-controller-actions-using-real-time-model-events/
- https://gist.github.com/mikermcneil/8777183
- https://gist.github.com/mikermcneil/8465536
- https://gist.github.com/mikermcneil/6598661
Sockets and sessions
heads up guys- as of 0.10.x all this stuff can now be done using the sails.sockets.*
methods: http://sailsjs.org/#/documentation/reference/websockets/sails.sockets
Also, in v0.11 (which will be released soon) we've upgraded to socket.io v1.0, which changes some of the underlying usage in the gist above. Fortunately, if you use the sails.sockets.*
wrapper methods, you won't need to change any code (I'm taking care of the mapping under the covers)
Where's the official docs? The above link is not working anymore, @mikermcneil.
this is awesome if someone update the video on Youtube ~~~ , the version on Youtube was still 0.9.7~
Documentation can now be found here
Thanks everyone for the links! We're in the middle of some major documentation improvements (particularly in relation to sockets) which will be deployed here. In the mean time, if you're interested in contributing, you can use http://next.sailsjs.org/documentation/reference/web-sockets/sails-sockets for previewing purposes. More info on contributing to Sails docs here.
do you have an example on how to connect regular nodejs client, and swift or android clients to sails js socket io server also? I'd like to see if I could connect my mobile phones to get push notification from sailsjs socket io server, thank you!
Hi,
Please help me, I want to use sails socket with android. any library for android or how to use socket.io directly with sails.js
hi guys, i implemented socket.io but have an issue, can you look at my code and help?
https://stackoverflow.com/questions/56963376/angular-8-using-sails-js-websokcet-sokcet-io
how would anyone implement this in routes ?
'GET /is/it/micky': {action: 'validate-micky', isSocket: true}
< in routes.js ?
I feel like this should definitely be included in the primary documentation on Sails / Socket.io. It took me quite a while to find this.