Javascript 从Meteor服务器端方法访问集合

Javascript 从Meteor服务器端方法访问集合,javascript,meteor,Javascript,Meteor,服务器端方法是否也由发布管理?我认为服务器端方法可以修改它想要的任何内容 在我的例子中,在template的助手中,我有Meteor.call('serverMethod',id),然后在collections/methods.js中定义serverMethod 通过发布,template只能访问一条记录(idone),但这是唯一一条serverMethodsees 但是当我将所有内容发布到template时,serverMethod会看到所有内容 这不奇怪吗?我认为服务器方法的目的是可信的,这

服务器端方法是否也由发布管理?我认为服务器端方法可以修改它想要的任何内容

在我的例子中,在
template
的助手中,我有
Meteor.call('serverMethod',id)
,然后在
collections/methods.js
中定义
serverMethod

通过发布,
template
只能访问一条记录(idone),但这是唯一一条
serverMethod
sees

但是当我将所有内容发布到
template
时,
serverMethod
会看到所有内容

这不奇怪吗?我认为服务器方法的目的是可信的,这样我就可以修改任何需要修改的内容,而无需发布整个数据库?有什么我遗漏的吗


我的
allow
权限设置良好,与应用程序的其他部分一样工作正常。

服务器端方法可以访问所有内容,不受允许或拒绝规则或发布方法的约束

您必须手动检查用户是否具有对每个方法执行操作的权限


可能是因为
serverMethod
正在从客户端传递
id
,所以从技术上讲,它只能看到客户端可以看到的东西?(因为id是传递回服务器的内容)

您最初的假设是正确的-服务器上的方法是“可信代码”,因此可以完全访问您的集合(发布和拒绝规则不适用)

我认为混淆之处在于
serverMethod
是在共享目录中定义的,因此将在客户端和服务器上运行(除非它使用
Meteor.isServer
包装)。因此,如果在客户机上启动调用,它将运行两个版本。根据方法的实际功能和调用方式,您可能只能看到客户端调用的结果。方法的客户端版本受发布到客户端的内容限制

我怀疑在助手的内部,您正在执行以下操作:

var result = Meteor.call('serverMethod', id);
这表示:“调用
serverMethod
的客户端模拟,并立即返回结果”。为了实际从服务器获取值,需要使用回调。例如:

Meteor.call('serverMethod', id, function (error, result) { console.log(result); } );

如果上述信息是对问题的准确描述,那么您现在需要处理另一个问题:不能在模板帮助器中使用异步回调的值。更多信息请参见。

你知道吗,我是个傻瓜。它一直在工作。浏览器控制台显示错误,但这是意料之中的,因为发布有限。回顾过去,Meteor控制台上没有错误,在检查数据库时,一直在进行更新。对不起,我太天真了…非常感谢你。在这里发布之前,我尽我所能,但有时我会错过一些明显的事情。从客户端对Meteor方法的调用是异步的,所以让我感到困惑的是,你会从模板助手中调用一个方法。你能解释一下你的用例吗?当用户在浏览器中修改单个帖子上的标签时,我正在尝试更新相关帖子上的标签。具体来说:浏览器正在显示丰田邮报。当用户将标签Japanese添加到Toyota时,服务器会更新Camry、Corolla和Land Cruiser,以包含日本标签。这样做最简单,因为事件是由我使用的标签插件触发的。不用担心…我知道发生了什么!谢谢你的关注,这是我的问题。我只是看了一下浏览器的错误,完全忽略了服务器端的情况——它一直工作得很好。很抱歉提出这个问题……我的疏忽是毫无意义的。感谢您链接到关于helpers中回调的问题…这与我现在所做的工作无关,但仍然非常有用。