我正在尝试使用订阅功能described here。但是,在编辑/assets/js/app.js
时,我收到此错误:
Uncaught ReferenceError: Room is not defined
所以,我不完全确定为什么,但它找不到我的模型。这是我的代码:
Room.subscribe(req, [{id: "5278861ab9a0d2cd0e000001"}], function (response) {
console.log('subscribed?');
console.log(response);
});
,这是在app.js
的上下文中(function (io) {
// as soon as this file is loaded, connect automatically,
var socket = io.connect();
if (typeof console !== 'undefined') {
log('Connecting to Sails.js...');
}
socket.on('connect', function socketConnected() {
// Listen for Comet messages from Sails
socket.on('message', function messageReceived(message) {
///////////////////////////////////////////////////////////
// Replace the following with your own custom logic
// to run when a new message arrives from the Sails.js
// server.
///////////////////////////////////////////////////////////
log('New comet message received :: ', message);
//////////////////////////////////////////////////////
});
///////////////////////////////////////////////////////////
// Here's where you'll want to add any custom logic for
// when the browser establishes its socket connection to
// the Sails.js server.
///////////////////////////////////////////////////////////
log(
'Socket is now connected and globally accessible as `socket`.\n' +
'e.g. to send a GET request to Sails, try \n' +
'`socket.get("/", function (response) ' +
'{ console.log(response); })`'
);
///////////////////////////////////////////////////////////
// This is the part I added:
Room.subscribe(req, [{id: "5278861ab9a0d2cd0e000001"}], function (response) {
console.log('subscribed?');
console.log(response);
});
//
});
// Expose connected `socket` instance globally so that it's easy
// to experiment with from the browser console while prototyping.
window.socket = socket;
// Simple log function to keep the example simple
function log () {
if (typeof console !== 'undefined') {
console.log.apply(console, arguments);
}
}
})(
我是以正确的方式来做这件事的吗?我应该将此直接存储在 app.js中吗?
答案 0 :(得分:28)
要订阅模型实例,我使用以下实时模型事件模式,其中一些模式驻留在客户端上,一些模式驻留在服务器上。请记住,客户端不能只订阅自己 - 您必须向服务器发送请求,让它知道您喜欢订阅 - 这是安全地执行此操作的唯一方法。 (例如,您可能希望发布包含敏感信息的通知 - 您希望确保连接套接字有权在订阅它之前查看该信息。)
我将使用带有User模型的应用程序示例。假设我想在现有用户登录时通知他们。
在客户端,为简单起见,如果您使用{{1},我将使用app.js
文件夹(或/assets/js
文件夹中的现有/assets/linker/js
文件在构建应用程序时切换。)
要将我的套接字请求发送到--linker
内的服务器,我将使用assets/js/app.js
方法。此方法模仿AJAX“get”请求(即socket.get()
)的功能,但使用套接字而不是HTTP。 (仅供参考:您还可以访问$.get()
,socket.post()
和socket.put()
。
代码看起来像这样:
socket.delete()
在
// Client-side (assets/js/app.js)
// This will run the `welcome()` action in `UserController.js` on the server-side.
//...
socket.on('connect', function socketConnected() {
console.log("This is from the connect: ", this.socket.sessionid);
socket.get(‘/user/welcome’, function gotResponse () {
// we don’t really care about the response
});
//...
中的welcome()
操作,现在,我们实际上可以使用UserController.js
方法将此客户端(套接字)订阅到通知。
User.subcribe()
我希望套接字'监听'我要从服务器发送的消息。为此,我将使用:
// api/UserController.js
//...
welcome: function (req, res) {
// Get all of the users
User.find().exec(function (err, users) {
// Subscribe the requesting socket (e.g. req.socket) to all users (e.g. users)
User.subscribe(req.socket, users);
});
}
//...
最后,我将开始使用:
// Client-side (assets/js/app.js)
// This will run the `welcome()` action in `UserController.js` on the backend.
//...
socket.on('connect', function socketConnected() {
console.log("This is from the connect: ", this.socket.sessionid);
socket.on('message', function notificationReceivedFromServer ( message ) {
// e.g. message ===
// {
// data: { name: ‘Roger Rabbit’},
// id: 13,
// verb: ‘update’
// }
});
socket.get(‘/user/welcome’, function gotResponse () {
// we don’t really care about the response
});
// ...
User.publishUpdate(id);