- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我花了很长时间尝试将 Socket.IO-Client 连接到在 Sails.js 框架上运行的服务器。客户端基本上是一个在 Raspberry Pi 上使用 Node.js 运行的简单 JavaScript 应用程序。
这个想法是一个简单的设备连接到一个服务器,然后服务器注册该设备并为它订阅消息。设备从服务器接收消息并执行一些操作。我不希望客户端依赖于任何框架,因此,我试图避免使用 Sailsjs-socket.io-client。目前服务器和客户端都在我的本地机器上运行。这是代码:
// Server side. Sails.js. DevicesController.js
module.exports = {
handshake: function (req, res) {
if (!req.isSocket) return res.badRequest();
Devices.create({}).exec(function (error, data) {
Devices.subscribe(req.socket, data);
});
return res.ok();
}
};
// Client side
var socket = require('socket.io-client')('http://localhost:1337/devices/handshake');
socket.on('error', function(e) {
console.log(e);
// Here I get 'Invalid namespace'
});
因此,我在客户端收到错误“无效命名空间”,如果我是对的,这意味着服务器没有打开“/devices/handshake”。但是,在服务器端,如果我列出现有房间 ID (sails.sockets.rooms()),我可以看到当客户端尝试连接到服务器时,总是会创建一个新房间。
我尝试使用下面的 javascript 从浏览器连接到“/devices/handshake”,显然它有效。它显然与 Sailsjs-socket.io-client 一起运行。
io.socket.get('/devices/handshake', function (data, jwres) {
console.log(jwres);
});
io.socket.on('devices', function (data, jwres) {
console.log(data);
});
知道我做错了什么吗?
最佳答案
看来您在这里混淆了一些概念:即 Socket.io 命名空间、Socket.io 路径和 Sails 路由。您可以通过查看 Socket.io docs 了解更多关于前两个的信息。 .就 Sails 而言,要记住的主要事情是它仅 监听默认/
命名空间上的连接;因此,您应该始终将客户端套接字连接到:
var socket = require('socket.io-client')('http://localhost:1337');
在末尾添加 /devices/handshake
不会更改套接字尝试连接的 URL;它将始终尝试连接到 http://localhost:1337/socket.io
。相反,这意味着它将尝试使用 Sails 未提供的 /devices/handshake
命名空间注册套接字。
另一方面,当您调用 io.socket.get('/devices/handshake')
时,您正在使用 Sails 套接字客户端库向那个 route 在您的应用程序中,就像您使用 AJAX 一样(例如 jQuery 中的 $.get('/devices/handshake')
)。这正是创建 sails.io.js
的原因——它使这类事情变得非常简单!它也并没有真正把你束缚在前端; sails.io.js
所做的只是提供一些包装器,以便通过套接字轻松地与 Sails 后端进行通信。在幕后,io.socket.get
只是使用 Socket.io-client .emit()
方法发送一个 get
事件到服务器,带有描述要运行的 Sails 操作的 URL 和参数的负载。所以,这:
io.socket.get('/devices/handshake', function(body, res){...})
相当于连接自己的socket,这样做:
socket.emit('get', {url: '/devices/handshake'}, function(res){...})
在首次连接时为套接字运行逻辑的推荐方法是允许套接字在客户端完全连接,然后从客户端向服务器发出请求(正是您在第二个代码中所做的堵塞)。要详细了解其背后的原因,请参阅 this note in the Sails 0.11.x migration guide .该说明还解释说,如果您必须出于某种原因在服务器连接后立即运行逻辑,您可以这样做
sails.io.on('connect', function (newlyConnectedSocket){})
在你的引导函数中(config/bootstrap.js
)。
关于javascript - 如何将 Socket.IO-Client 连接到 Sails.js 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35175338/
我是一名优秀的程序员,十分优秀!