Sails pubsub 如何订阅模型实例?
Sails pubsub how to subscribe to a model instance?
我很难在客户端接收 pubsub 事件。客户端存储(回流)使用其 id 从项目中获取数据。据我了解,这会自动订阅实时事件的 Sails 套接字(从 0.10 版开始),但我没有看到它发生。
这是我的客户商店从 sails 获取数据
(这是ES6语法)
onLoadProject(id) {
var url = '/api/projects/' + id;
io.socket.get(url, (p, jwres) => {
console.log('loaded project', id);
this.project = p;
this.trigger(p);
});
io.socket.on("project", function(event){
console.log('realtime event', event);
});
},
然后我在我的项目控制器中创建了一个测试 "touch" 操作,只是为了更新 modifiedAt 字段。
touch: function(req, res){
var id = req.param('id');
Project.findOne(id)
.then(function(project) {
if (!project) throw new Error('No project with id ' + id);
return Project.update({id: id}, {touched: project.touched+1});
})
.then(function(){
// this should not be required right?
return Project.publishUpdate(id);
})
.done(function() {
sails.log('touched ok');
res.ok();
}, function(e) {
sails.log("touch failed", e.message, e.stack);
res.serverError(e.message);
});
}
这不会在我的客户端代码中触发任何实时事件。我还添加了一个手册 Project.publishUpdate(),但这不是必需的吗?
我错过了什么?
--------编辑---------
我的模型 touched 属性导致了一个复杂的结果,因为我将它设置为 'number' 而不是 'integer' 并且 ORM 异常没有被 promise 错误处理捕获而没有捕获() 部分。所以上面的代码有效,欢呼!但是每个项目实例都会收到实时事件。
所以让我改一下我的问题:
如何将客户端套接字订阅到实例而不是模型?我可以在客户端检查 id 并检索更新的实例数据,但这似乎效率低下,因为每个客户端都会收到有关每个项目的通知,即使他们只应该关心一个项目。
-----再次编辑-----
没关系。我从每个实例获取更新的原因很简单,因为在我的应用程序开始时,我触发了一个 findAll 来获取可用项目的列表。结果我的套接字得到了所有的订阅。解决方法是通过纯 http 而不是套接字启动该调用,或者使用单独的控制器操作来检索列表(从而绕过蓝图路由)。我选择了第二个选项,因为在我的情况下,在选择一个之前获取所有项目数据是愚蠢的。
所以回答我自己的问题。我从每个实例获取更新的原因很简单,因为在我的应用程序开始时,我触发了一个 findAll 来获取可用项目的列表。结果我的套接字得到了所有的订阅。
解决方法是通过纯 http 而不是套接字启动该调用,或者使用单独的控制器操作来检索列表(从而绕过蓝图路由)。我选择了第二个选项,因为在我的例子中,在选择一个之前获取所有资源数据是愚蠢的。
这是我用来列出所有资源的函数,我在其中过滤了部分与最初浏览列表无关的数据。
list: function(req, res) {
Project.find()
.then(function(projects) {
var keys = [
'id',
'name',
'createdAt',
'updatedAt',
'author',
'description',
];
return projects.map(function(project){
return _.pick(project, keys);
});
})
.catch(function (e){
res.serverError(e.message);
})
.done(function(list){
res.json(list);
}, function(e) {
res.serverError(e.message);
});
},
请注意,当用户加载一个资源(在我的例子中是项目)然后切换到另一个资源时,客户端将订阅这两个资源。我相信它需要一个操作请求,您可以在其中明确取消订阅套接字以防止这种情况发生。就我而言,这不是问题,但我打算稍后解决。
希望对大家有所帮助。
我很难在客户端接收 pubsub 事件。客户端存储(回流)使用其 id 从项目中获取数据。据我了解,这会自动订阅实时事件的 Sails 套接字(从 0.10 版开始),但我没有看到它发生。
这是我的客户商店从 sails 获取数据 (这是ES6语法)
onLoadProject(id) {
var url = '/api/projects/' + id;
io.socket.get(url, (p, jwres) => {
console.log('loaded project', id);
this.project = p;
this.trigger(p);
});
io.socket.on("project", function(event){
console.log('realtime event', event);
});
},
然后我在我的项目控制器中创建了一个测试 "touch" 操作,只是为了更新 modifiedAt 字段。
touch: function(req, res){
var id = req.param('id');
Project.findOne(id)
.then(function(project) {
if (!project) throw new Error('No project with id ' + id);
return Project.update({id: id}, {touched: project.touched+1});
})
.then(function(){
// this should not be required right?
return Project.publishUpdate(id);
})
.done(function() {
sails.log('touched ok');
res.ok();
}, function(e) {
sails.log("touch failed", e.message, e.stack);
res.serverError(e.message);
});
}
这不会在我的客户端代码中触发任何实时事件。我还添加了一个手册 Project.publishUpdate(),但这不是必需的吗?
我错过了什么?
--------编辑---------
我的模型 touched 属性导致了一个复杂的结果,因为我将它设置为 'number' 而不是 'integer' 并且 ORM 异常没有被 promise 错误处理捕获而没有捕获() 部分。所以上面的代码有效,欢呼!但是每个项目实例都会收到实时事件。
所以让我改一下我的问题:
如何将客户端套接字订阅到实例而不是模型?我可以在客户端检查 id 并检索更新的实例数据,但这似乎效率低下,因为每个客户端都会收到有关每个项目的通知,即使他们只应该关心一个项目。
-----再次编辑-----
没关系。我从每个实例获取更新的原因很简单,因为在我的应用程序开始时,我触发了一个 findAll 来获取可用项目的列表。结果我的套接字得到了所有的订阅。解决方法是通过纯 http 而不是套接字启动该调用,或者使用单独的控制器操作来检索列表(从而绕过蓝图路由)。我选择了第二个选项,因为在我的情况下,在选择一个之前获取所有项目数据是愚蠢的。
所以回答我自己的问题。我从每个实例获取更新的原因很简单,因为在我的应用程序开始时,我触发了一个 findAll 来获取可用项目的列表。结果我的套接字得到了所有的订阅。
解决方法是通过纯 http 而不是套接字启动该调用,或者使用单独的控制器操作来检索列表(从而绕过蓝图路由)。我选择了第二个选项,因为在我的例子中,在选择一个之前获取所有资源数据是愚蠢的。
这是我用来列出所有资源的函数,我在其中过滤了部分与最初浏览列表无关的数据。
list: function(req, res) {
Project.find()
.then(function(projects) {
var keys = [
'id',
'name',
'createdAt',
'updatedAt',
'author',
'description',
];
return projects.map(function(project){
return _.pick(project, keys);
});
})
.catch(function (e){
res.serverError(e.message);
})
.done(function(list){
res.json(list);
}, function(e) {
res.serverError(e.message);
});
},
请注意,当用户加载一个资源(在我的例子中是项目)然后切换到另一个资源时,客户端将订阅这两个资源。我相信它需要一个操作请求,您可以在其中明确取消订阅套接字以防止这种情况发生。就我而言,这不是问题,但我打算稍后解决。
希望对大家有所帮助。