.subscribe()
将请求客户端套接字订阅到一个或多个数据库记录的更改/删除。
Something.subscribe(req, ids);
参数 | 类型 | 详情 | |
---|---|---|---|
1 | req | 包含要订阅的套接字的传入套接字请求 (req )。 |
|
2 | ids | 记录 ID(主键值)数组。 |
当客户端套接字订阅记录时,它成为其动态“记录房间”的成员。这意味着它将接收 .publish()
广播到该房间的所有消息。
在服务器端,在控制器操作中
// On the server:
if (!this.req.isSocket) {
throw {badRequest: 'Only a client socket can subscribe to Louies. But you look like an HTTP request to me.'};
}
// Let's say our client socket has a problem with people named "louie".
// First we'll find all users named "louie" (or "louis" even-- we should be thorough)
let usersNamedLouie = await User.find({ or: [{name: 'louie'},{name: 'louis'}] });
// Now we'll subscribe our client socket to each of these records.
User.subscribe(this.req, _.pluck(usersNamedLouie, 'id'));
// All done! We might send down some data, or just an empty 200 (OK) response.
然后,回到我们的客户端代码中
// On the client:
// Send a request to the "subscribeToLouies" action, subscribing this client socket
// to all future events that the server publishes about Louies.
io.socket.get('/foo/bar/subscribeToLouies', function (data, jwr){
if (jwr.error) {
console.error('Could not subscribe to Louie-related notifications: '+jwr.error);
return;
}
console.log('Successfully subscribed.');
});
从现在开始,只要我们请求的客户端套接字保持连接状态,它就会在我们的服务器端代码(例如其他操作或助手)为我们上面订阅的其中一个 Louies 调用 User.publish()
时收到通知。
为了让我们的客户端代码处理这些未来的通知,它必须使用 .on()
监听相关的事件。例如
// On the client:
// Whenever a `user` event is received, say something.
io.socket.on('user', function(msg) {
console.log('Got a message about a Louie: ', msg);
});
有关 Sails/Socket.IO 中房间和事件之间差异的更多背景信息,请参阅 概念 > 实时。
对于某些应用程序,您可能会发现自己需要管理与同一记录相关的两个不同通道。为此,您可以结合使用 .getRoomName()
和 sails.sockets.join()
// On the server, in your subscribe action…
if (!orgId) { throw 'badRequest'; }
if (!this.req.isSocket) { throw {badRequest: 'This action is designed for use with WebSockets.'}; }
let me = await User.findOne({
id: this.req.session.userId
})
.populate('globalAdminOfOrganizations');
// Subscribe to general notifications.
Organization.subscribe(this.req, orgId);
// If this user is a global admin of this organization, then also subscribe them to
// an additional private room (this is used for additional notifications intended only
// for global admins):
if (globalAdminOfOrganizations.includes(orgId)) {
let privateRoom = Organization.getRoomName(`${orgId}-admins-only`);
sails.sockets.join(this.req, privateRoom);
}
稍后,要发布到其中一个房间,只需计算相应的房间名称(例如,“13-admins-only”)并使用 sails.sockets.broadcast()
发布您的通知。
- 在传入
req
以引用请求套接字之前,请确保检查req.isSocket === true
。提供的req
必须来自套接字请求,而不仅仅是任何旧的 HTTP 请求。.subscribe()
仅适用于通过 Socket.IO 连接(例如,使用io.socket.get()
)发出的请求,不适用于通过 HTTP 连接(例如,使用jQuery.get()
)发出的请求。有关使用客户端套接字通过 Sails 发送 WebSockets/Socket.IO 消息的信息,请参阅sails.io.js
套接字客户端文档。- 此函数实际上不会与数据库交互!事实上,所有资源型 PubSub 方法都不会。相反,这些方法构成了构建在较低级别
sails.sockets
方法之上的简化抽象层,旨在通过使用事件/房间/命名空间等的常规名称来使您的应用程序更简洁、更易于调试。