1

我有一个页面,用户可以在其中输入新的电子邮件地址,然后此方法尝试将其添加到他们的帐户中:

Meteor.methods({
  add_new_email: function(address)
  {
    Accounts.addEmail(Meteor.userId(), address);
  }
});

我在 Meteor 中使用 accounts-password 包。

我想在用户尝试添加新地址后给他们有意义的反馈,特别是如果它失败了,为什么它会失败?我查看了文档,但似乎没有任何方法可以找出失败原因。

我知道我可以在尝试添加新地址之前和之后计算用户的电子邮件地址,但这并不能告诉我该地址是否已经属于另一个用户,或者它是否是用户的现有地址,或者是什么失败的原因。

有没有办法找出这样的 API 调用的结果?

4

3 回答 3

0

您可以在此处阅读有关此方法的作用的信息: https ://github.com/meteor/meteor/blob/master/packages/accounts-password/password_server.js#L847

如您所见,该方法仅在一种情况下会失败:

如果有不同的用户使用不同的电子邮件,则操作将失败

因此,如果该方法失败,您可以告诉用户该电子邮件已注册。

于 2015-12-04T12:38:30.843 回答
0

我知道我参加聚会有点晚了,但我今天遇到了这个问题并找到了你的帖子。

我需要能够在服务器端判断它是否失败,所以我所做的就是把它放在一个 try-catch 中,如下所示:

let addSucceeded = false;

try{
    Accounts.addEmail(user._id, newEmailAddress);
    addSucceeded = true;
} catch(err) {}

console.log(addSucceeded);

只有当 Accounts.addEmail 没有失败时,addSucceeded 才会被设置为 true。为了确保我不会遇到“失败,因为它在不同情况下替换了同一用户的电子邮件地址”场景,我总是在保存时使用 toLowerCase() 电子邮件地址。

于 2016-04-25T23:44:37.240 回答
0

在尝试了更多之后,似乎我需要做的就是在调用该方法时向我的客户端添加一个回调,并在那里检查是否有错误。任何错误都会自动返回给回调。

服务器:

Meteor.methods({
  add_new_email: function(address)
  {
    Accounts.addEmail(Meteor.userId(), address);
  }
});

客户:

Meteor.call('add_new_email', 'me@example.com', function(error){
  if (error) console.log("got an error " + error.reason);
});

我没有意识到来自 API 的错误会传递到我的方法中。流星——它总是比我想象的更聪明!

另请注意,您可以在方法中使用 Meteor.Error 来抛出错误,这些错误将以完全相同的方式传递给客户端回调,请参阅文档

if (!Meteor.userId()) {
  throw new Meteor.Error("not-authorized", "You must be signed in to write a new post");
}
于 2015-12-04T19:07:03.500 回答