调用方法时出错'':未找到方法[404]

时间:2015-01-02 08:06:16

标签: meteor

在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无效的原因。

2 个答案:

答案 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字母词定义。