服务器端方法是否也受出版物管辖?我认为服务器端方法可以修改它想要的任何内容。
就我而言,在template
的帮助者中,我有Meteor.call('serverMethod', id)
,然后在serverMethod
中定义collections/methods.js
。
通过发布,template
只能访问一条记录(id
一条),但这是唯一serverMethod
看到的记录。
但当我将所有内容发布到template
时,serverMethod
会看到所有内容。
这不奇怪吗?我认为服务器方法的目的是值得信任的,这样我就可以修改我需要的任何内容而无需发布整个数据库?有什么我想念的吗?
我的allow
权限设置正常,与应用的其他部分一样正常。
答案 0 :(得分:1)
您的初步假设是正确的 - 服务器上的方法是#34;受信任的代码",因此可以完全访问您的集合(出版物和拒绝规则不适用)。
我认为混淆是serverMethod
在共享目录中定义,因此将在客户端和服务器上运行(除非它用Meteor.isServer
包装)。因此,如果在客户端上启动呼叫,它将运行两个版本。根据方法实际执行的操作以及调用方式,您可能只能看到客户端调用的结果。 方法的客户端版本受已发布到客户端的内容的限制。
我怀疑你的助手里面有这样的事情:
var result = Meteor.call('serverMethod', id);
这说:"调用serverMethod
的客户端模拟并立即返回结果"。为了从服务器实际获取值,您需要使用回调。例如:
Meteor.call('serverMethod', id, function (error, result) { console.log(result); } );
如果以上信息准确描述了问题,那么您现在还有另一个问题需要处理:您无法在模板助手中使用异步回调的值。有关详细信息,请参阅this question。
答案 1 :(得分:0)
服务器端方法可以访问所有内容,并且不受允许或拒绝规则或发布方法的约束
您必须手动检查用户是否有权按每种方法执行某些操作。
可能是因为serverMethod
正在从客户端传递id
,所以从技术上讲,它最终只会看到客户端可以看到的内容? (因为id是什么传递回服务器)