Javascript 我能';t通过Meteor.call调用Accounts.findUserByEmail()服务器端

Javascript 我能';t通过Meteor.call调用Accounts.findUserByEmail()服务器端,javascript,meteor,Javascript,Meteor,我只是想验证是否存在带有特定电子邮件的帐户,但是我了解到,Accounts.findUserByEmail()只在服务器端工作 似乎反复建议的方法是定义一个Meteor.method(),并在其中完成所有工作。不幸的是,我显然不知道自己在做什么,因为我犯了一个别人都没有犯过的错误 component.js: Meteor.call('confirm', email); 方法.js: Meteor.methods({ 'confirm': (email) => { if (Ac

我只是想验证是否存在带有特定电子邮件的帐户,但是我了解到,
Accounts.findUserByEmail()
只在服务器端工作

似乎反复建议的方法是定义一个
Meteor.method()
,并在其中完成所有工作。不幸的是,我显然不知道自己在做什么,因为我犯了一个别人都没有犯过的错误

component.js:

Meteor.call('confirm', email);
方法.js:

Meteor.methods({
  'confirm': (email) => {
    if (Accounts.findUserByEmail(email)) {
      return;
    }
  }
});
我得到的只是这个错误:

模拟调用“确认”类型错误的效果时出现异常:Accounts.findUserByEmail不是函数

我是否完全误解了Meteor.methods+Meteor.call的动态?它实际上不是服务器端吗


目前正在使用Meteor软件包,
帐户-password@1.3.3

Meteor也通过运行方法的“存根”在前端模拟方法调用。这样做的目的是获得更好的用户体验,因为UI会在服务器响应之前立即更新。但是,这也意味着,如果在Meteor方法中运行仅限服务器的代码,则必须确保代码仅在服务器上运行:

Meteor.methods({
  'confirm': (email) => {
    if (Meteor.isServer && Accounts.findUserByEmail(email)) {
      return;
    }
  }
});

或者,您可以将上述方法定义放置在仅加载到服务器上的文件中,就像
/server
-目录中的任何文件或
/imports
中的(推荐)文件一样,放置到仅由服务器代码包含的文件中。然后您不需要单独使用Meteor.isServer。

如果客户端代码包含方法定义,它将被视为存根,这意味着它在提供“乐观UI”的特殊模式下运行,一旦实际的服务器方法将其响应返回给客户端,它对数据的影响将被撤消

为客户机和服务器实现不同版本的(至少部分)方法是值得的,并且避免在客户机上包含其中的一些方法

如果您选择在客户端和服务器上使用相同的功能,则有
Meteor.isServer
Meteor.isClient
和(后者专门用于方法),允许您仅在客户端/服务器上执行部分块

请注意,问题中的代码没有达到您期望的效果,,并且您没有检查方法参数

对于这个特定的用例,您可能应该只在服务器上实现该方法(只是不在客户端构建中导入其代码):

您可以在中阅读有关方法生命周期的更多信息

根据指南(要点,省略了一些细节):

  • 方法模拟在客户机上运行-如果我们在客户机和服务器代码中定义了此方法(所有方法都应该如此),则在调用它的客户机中执行方法模拟

    客户机进入一种特殊模式,在该模式下,它跟踪对客户机端集合所做的所有更改,以便以后可以回滚这些更改。完成此步骤后,应用程序的用户会看到他们的UI立即更新为客户端数据库的新内容,但服务器尚未收到任何数据

  • 将方法DDP消息发送到服务器
  • 方法在服务器上运行
  • 返回值被发送到客户端
  • 任何受该方法影响的DDP出版物都将更新
  • 已更新
    发送到客户端的消息,用服务器结果替换数据,方法回调启动

    在将相关数据更新发送到正确的客户端后,服务器发回方法生命周期中的最后一条消息——带有相关方法ID的DDP更新消息。客户端回滚在步骤1的方法模拟中对客户端数据所做的任何更改,并将其替换为步骤5中从服务器发送的实际更改

    最后,传递给Meteor.call的回调实际上使用步骤4中的返回值触发。回调必须等到客户端是最新的,这样方法回调就可以假设客户端状态反映了方法内部所做的任何更改


  • 哦,我的上帝,非常感谢你!我很惭愧地承认,在
    /server
    之外执行时,我完全忘记了
    Meteor.isServer
    !你是个英雄。现在等待2分钟,选择正确的答案。哦,太棒了,这是我第一次读到关于
    这个的内容。isSimulation
    !非常感谢你的回答。
    Meteor.methods({
      isEmailInSystem(email) {
        check(email, String);
        return !!Accounts.findUserByEmail(email);
      }
    });