伪代码:
Meteor.publish 'stuff', ->
if this.userId
return doStuffForLoggedInUsers(this.userId)
else if url matches '/some_url/:user_api_key'
return doStuffForApiKey(apiKey)
else
return null
使用Iron Router的解决方案将是最佳的,但非路由框架解决方案也会有所帮助。
答案 0 :(得分:2)
也许是这样的:
Router.map(function() {
this.route('postsWithKey', {
path: '/posts/:apiKey',
template: 'posts',
before: function() {
this.subscribe('posts', this.params.apiKey);
}
});
return this.route('posts', {
before: function() {
this.subscribe('posts');
}
});
});
Meteor.publish('posts', function(apiKey) {
check(apiKey, Match.Optional(String));
if (apiKey) {
return Posts.find({key: apiKey});
} else if (this.userId) {
return Posts.find({owner: this.userId});
}
});
当运行带有api密钥的路由时,客户端将使用密钥激活posts
订阅。在服务器上,如果密钥存在,则返回一个游标,否则如果用户登录则返回不同的游标。您可以对密钥进行更复杂的验证 - 例如如果数据库中不存在错误,则抛出错误。