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
和(后者专门用于方法),允许您仅在客户端/服务器上执行部分块
请注意,问题中的代码没有达到您期望的效果,,并且您没有检查方法参数
对于这个特定的用例,您可能应该只在服务器上实现该方法(只是不在客户端构建中导入其代码):
您可以在中阅读有关方法生命周期的更多信息
根据指南(要点,省略了一些细节):
已更新
发送到客户端的消息,用服务器结果替换数据,方法回调启动在将相关数据更新发送到正确的客户端后,服务器发回方法生命周期中的最后一条消息——带有相关方法ID的DDP更新消息。客户端回滚在步骤1的方法模拟中对客户端数据所做的任何更改,并将其替换为步骤5中从服务器发送的实际更改 最后,传递给Meteor.call的回调实际上使用步骤4中的返回值触发。回调必须等到客户端是最新的,这样方法回调就可以假设客户端状态反映了方法内部所做的任何更改
哦,我的上帝,非常感谢你!我很惭愧地承认,在
/server
之外执行时,我完全忘记了Meteor.isServer
!你是个英雄。现在等待2分钟,选择正确的答案。哦,太棒了,这是我第一次读到关于这个的内容。isSimulation
!非常感谢你的回答。
Meteor.methods({
isEmailInSystem(email) {
check(email, String);
return !!Accounts.findUserByEmail(email);
}
});