Emitting socket.io event from Sails.JS and handling it on server using Sails.JS skeleton

我是研究僧i 提交于 2019-12-03 06:07:04

问题


I have a problem in understanding the concept of sending socket.io events from Sails.js client side controller and handling them in server-side controllers. First of all, I have downloaded the SailsJS project skeleton using npm and the structure as follows:

Project:

api
--adapters
--controllers
----server_userController.js
--models
--polices
--services

assets
--[styles, views, images, bower_components, and etc]
--js
----controllers
------userController.js
----app.js
----sails.io.js
----socket.io.js
config
node_modules
views

I wrote the following in "assets/js/controllers/server_userController.js":

socket.emit('getUser', {
    _id: 10
});

Now, how to specify which server-side controller is responsible for handling this event, and how? I want this event to be received in "api/controllers/server_userController.js". So, something like this will be in the controller:

module.exports = {
  //Handling socket request here
  //Emitting socket request
};

Thanks in advance


回答1:


If all you're trying to do is run a Sails controller action via sockets, then you don't need to emit anything at all. Part of Sails' charm is that it can route regular, HTTP-style requests over sockets. So if you have a controller /api/controllers/FooController.js like:

module.exports = {

    bar: function (req, res) {

        // Note, you can check whether this was a socket request
        // with req.isSocket, and if so access the connecting
        // socket with req.socket

        res.json({"message": "Hello!"});

    }

}

and you include the bundled sails.io.js file in your client-side app, then you can access that action via:

socket.get('/foo/bar', function(data) {
    // data will contain {message:"hello"}
}

Note: if you're using the newer version of sails.io.js that is included with Sails v0.10.x, it's io.socket.get.

If you really want to catch socket events on the server, the best place to register them is in your /config/socket.js file, in the onConnect method:

onConnect: function (socket, session) {

    socket.on('some_event', function(data) {
        // handle event here
    });

}

This is better than putting the event handlers in a controller, because any time that controller action ran it would bind the event again, and you'd see the callback being run multiple times.




回答2:


Be sure to read the SailsJS v0.11 Migration Guide before using onConnect. This has now been deprecated.



来源:https://stackoverflow.com/questions/22454809/emitting-socket-io-event-from-sails-js-and-handling-it-on-server-using-sails-js

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!