Как определить, удалось или нет 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
Как видите, метод потерпит неудачу только в одном случае:
Операция не будет выполнена, если есть другой пользователь с адресом электронной почты, отличающимся только регистром
Поэтому, если метод не удался, вы можете сообщить пользователю, что электронная почта уже зарегистрирована.