从Sails.JS发出socket.io事件并使用Sails.JS框架在服务器上处理它

abd*_*oud 3 node.js socket.io sails.js

我在理解从Sails.js客户端控制器发送socket.io事件并在服务器端控制器中处理它们的概念时遇到问题.首先,我使用npm下载了SailsJS项目框架,结构如下:

项目:

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
Run Code Online (Sandbox Code Playgroud)

我在"assets/js/controllers/server_userController.js"中写了以下内容:

socket.emit('getUser', {
    _id: 10
});
Run Code Online (Sandbox Code Playgroud)

现在,如何指定哪个服务器端控制器负责处理此事件,以及如何处理?我希望在"api/controllers/server_userController.js"中收到此事件.所以,这样的东西将在控制器中:

module.exports = {
  //Handling socket request here
  //Emitting socket request
};
Run Code Online (Sandbox Code Playgroud)

提前致谢

sgr*_*454 20

如果您要做的只是通过套接字运行Sails控制器操作,那么您根本不需要emit任何操作.Sails的一部分魅力在于它可以通过套接字路由常规的HTTP样式请求.所以如果你有一个/api/controllers/FooController.js像这样的控制器:

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!"});

    }

}
Run Code Online (Sandbox Code Playgroud)

并且您将捆绑的sails.io.js文件包含在客户端应用程序中,然后您可以通过以下方式访问该操作:

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

注意:如果您使用的sails.io.js是Sails v0.10.x中包含的较新版本,那就是io.socket.get.

如果您真的想在服务器上捕获套接字事件,那么注册它们的最佳位置是在您的/config/socket.js文件中,onConnect方法如下:

onConnect: function (socket, session) {

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

}
Run Code Online (Sandbox Code Playgroud)

这比将事件处理程序放在控制器中更好,因为控制器操作运行的任何时候都会再次绑定事件,并且您会看到回调被多次运行.