Как определить, удалось или нет Accounts.addEmail, и если это не удалось, причина, по которой

У меня есть страница, где пользователь может ввести новый адрес электронной почты, а затем этот метод пытается добавить его в свою учетную запись:

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

Я использую пакет учетных записей-паролей в Meteor.

Я хотел бы дать пользователю значимые отзывы после того, как они попытаются добавить новый адрес, в частности, если он потерпел неудачу, почему он потерпел неудачу? Я посмотрел на документы, но, кажется, нет никакого способа узнать причину сбоя.

Я знаю, что могу сосчитать адреса электронной почты пользователя до и после попытки добавить новый, но это не говорит мне, принадлежит ли адрес уже другому пользователю, или это существующий адрес пользователя, или что-то еще причина отказа.

Есть ли способ узнать результат вызова API, подобного этому?

3 ответа

Решение

После еще нескольких экспериментов кажется, что все, что мне нужно сделать, это добавить обратный вызов к моему клиенту, когда я вызываю метод, и проверить там на наличие ошибки. Любая ошибка автоматически возвращается к обратному вызову.

Сервер:

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");
}

Я знаю, что немного опоздал на вечеринку, но я столкнулся с этой проблемой сегодня и нашел ваш пост.

Мне нужно было иметь возможность сказать на стороне сервера, провалился ли он или нет, поэтому я сделал это в виде try-catch следующим образом:

let addSucceeded = false;

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

console.log(addSucceeded);

Только в случае сбоя Accounts.addEmail для addSucceeded будет установлено значение true. Чтобы убедиться, что я не сталкиваюсь со сценарием "сбой, поскольку он заменил адрес электронной почты одного и того же пользователя в другом случае", я всегда при включении сохраняю адрес электронной почты.

Вы можете прочитать информацию о том, что этот метод делает здесь: https://github.com/meteor/meteor/blob/master/packages/accounts-password/password_server.js#L847

Как видите, метод потерпит неудачу только в одном случае:

Операция не будет выполнена, если есть другой пользователь с адресом электронной почты, отличающимся только регистром

Поэтому, если метод не удался, вы можете сообщить пользователю, что электронная почта уже зарегистрирована.

Другие вопросы по тегам