调用方法“”时出错:找不到方法 [404]

Error invoking Method '': Method not found [404]

在 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 不工作的原因。

当您使用 Meteor.methods 需要 服务器端的方法时,您只有存根方法,而客户端是可选的,以模拟延迟补偿。

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');

我注意到按字母顺序命名对于加载三个调用方法很重要。 当我有下一个结构时我遇到了同样的问题

server
  |----- dht-setup.js
  |----- methods.js

然后,dht-setup 看不到 methods.js 方法。相反,我更改了文件的名称:

server
  |---- _methods.js
  |---- dht-sensor.js

404 Not found,解决。当我想将函数与模板分开时,我在客户端发现了同样的问题,例如,将 D3js 函数与模板分开。您可能需要使用 "underscore" 字符“_”确保按字母顺序加载的顶部。 考虑到这一点,因为示例工作正常,因为方法在 STARTUP.JS 中至少按字母顺序定义。