在Meteor中,我在客户端定义的每个方法都会收到此错误:
Error invoking Method 'activeMenu': Method not found [404]
就像一个例子,在我的代码中,我已经定义了这个方法,如下所示:
/client/js/startup/methods.js
Meteor.methods({
...
activeMenu: function() {
if(Session.get('menu')) {
$('.menu').removeClass('active');
$('#' + Session.get('menu')).addClass('active');
}
},
...
});
从两个地方调用它 - 当应用程序首次渲染时,以及路由器执行其路由后:
client/js/rendered.js
Template.ApplicationLayout.rendered = function() {
Meteor.call('activeMenu');
}
/client/js/utils/router.js
Router.onAfterAction(function () {
Meteor.call('activeMenu');
});
每次通话都会引发错误。但是,该方法仍然有效,我得到了我期望的结果,所以调用一定是成功的,但我仍然遇到错误。这些方法仅在客户端运行,因为它们用于表示目的。我需要程序没有错误,因为我怀疑这是spiderable
无效的原因。
答案 0 :(得分:15)
当您在服务器端使用需要方法的Meteor.methods
时,您只有stub方法,而客户端是模拟延迟补偿的可选方法。
Meteor调用的工作方式是,当您运行一个调用时,它将立即触发客户端一个模拟一些UI效果,同时从服务器返回响应,然后激活服务器端调用。
这样做是为了让你可以有一个方法,即使服务器实际上需要时间来响应,但响应似乎是即时的。
由于您没有相应的服务器端方法,当Meteor将呼叫发送到服务器时,它无法找到它并响应错误Method not found [404]
如果您想要一个只有客户端有效的方法,您应该使用标准的js方法,而不使用var
关键字来确保其全局作用域(并且可以从其他客户端文件访问) )
activeMenu = function() {
if(Session.get('menu')) {
$('.menu').removeClass('active');
$('#' + Session.get('menu')).addClass('active');
}
}
然后在你的其他代码中:
activeMenu()
代替Meteor.call('activeMenu');
答案 1 :(得分:1)
我注意到字母名称对于加载三个调用方法很重要。 当我有下一个结构时,我遇到了同样的问题
server
|----- dht-setup.js
|----- methods.js
然后,dht-setup没有看到methods.js方法。相反,我更改了文件的名称:
server
|---- _methods.js
|---- dht-sensor.js
404找不到,解决。当我想要从模板中分离函数时,我在客户端找到了同样的问题,例如,将D3js函数与模板分开。您可能需要使用“下划线”字符“_”确保字母加载的顶部。 考虑一下,因为这些示例工作得很好,因为这些方法在STARTUP.JS中以leat字母词定义。