2014-02-13 3 views
0

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

Код указан в настоящий момент.

Шаблон:

<template name="addUser"> 
    <form role="form"> 
     <div class="form-group"> 
      <label for="firstName">First Name</label> 
      <input name="firstName" class="form-control" placeholder="First Name" /> 
     </div> 
     <div class="form-group"> 
      <label for="lastName">Last Name</label> 
      <input name="lastName" class="form-control" placeholder="Last Name" /> 
     </div> 
     <div class="form-group"> 
      <label for="email">Email</label> 
      <input name="email" class="form-control" placeholder="Email" /> 
     </div> 

     <button type="submit" class="btn btn-primary">{{faIcon 'plus'}} Add User</button> 
    </form> 
</template> 

шаблона Javascript:

Template.addUser.events({ 
    'submit form': function (e, t) { 
     e.preventDefault(); 

     var attrs = { 
      email: t.find('[name="email"]').value, 
      profile: { 
       firstName: t.find('[name="firstName"]').value, 
       lastName: t.find('[name="lastName"]').value, 
      } 
     }; 

     Meteor.call('addUser', attrs, function (err) { 
      if (err) { 
       Errors.throw(err.reason); 
      } else { 
       Router.go('home'); 
      } 
     }); 
    } 
}); 

Мой addUser метод

Meteor.methods({ 
    addUser: function (attrs) { 
     var user = Meteor.user(); 

     if (!user) throw new Meteor.Error(401, 'Please login.'); 
     if (!attrs.profile.firstName) throw new Meteor.Error(422, 'Please include a first name.'); 
     if (!attrs.profile.lastName) throw new Meteor.Error(422, 'Please include a first name.'); 
     if (!attrs.email) throw new Meteor.Error(422, 'Please include an email.'); 

     var user = _.pick(attrs, ['firstName', 'lastName', 'email']); 

     if (Meteor.isServer) { 
      var newUserId = Accounts.createUser(attrs); 
      Accounts.sendEnrollmentEmail(newUserId); 
     } 
    } 
}); 

Поскольку Accounts.createUser требует пароль на стороне клиента, я не могу понять, как уведомить клиента об успехе или неудаче, чтобы сделать что-то взломанное с помощью Session. Каков хороший способ сделать это?

+0

Какую информацию вы точно хотите отправить пользователю? Я вижу, что вы бросаете некоторые «Ошибки». Разве этого недостаточно? Кстати, почему бы не поставить весь метод только на сервер? Кроме того, помните, что последний аргумент «Meteor.call» может быть обратным вызовом, который вы можете использовать для определения успешного выполнения метода. –

+0

Я хотел бы уведомить пользователя о том, что вызовы 'Accounts.createUser' или' Accounts.sendEnrollmentEmail' терпят неудачу. Обычно я искал параметр ошибки в обратном вызове, но 'Accounts.createUser' генерирует исключение, если вы передадите ему обратный вызов на сервере. «Ошибка: Accounts.createUser с обратным вызовом, который еще не поддерживается на сервере». Лучшее, с чего я столкнулся, начиная с размещения вопроса, добавляет что-то к эффекту 'if (! NewUserId) { \t \t \t throw new Meteor.Error (500, 'Произошла ошибка при создании пользователя на сервере. попробуй еще раз.'); \t \t} ' –

ответ

2

во-первых, поставить addUser метод на сервере только (т.е. в server директории):

Meteor.methods({ 
    addUser: function (attrs) { 
    var user = Meteor.user(); 

    if (!user) // you can also check this.userId here 
     throw new Meteor.Error(401, 'Please login.'); 

    if (!attrs.profile.firstName) 
     throw new Meteor.Error(422, 'Please include a first name.'); 

    if (!attrs.profile.lastName) 
     throw new Meteor.Error(422, 'Please include a first name.'); 

    if (!attrs.email) 
     throw new Meteor.Error(422, 'Please include an email.'); 

    var user = _.pick(attrs, ['firstName', 'lastName', 'email']); 

    var newUserId = Accounts.createUser(attrs); 
    Accounts.sendEnrollmentEmail(newUserId); 
    } 
}); 

Затем на клиенте, вы можете сделать что-то вроде:

Meteor.call('addUser', attrs, function (err) { 
    if (err) { 
    console.log('something went wrong :('); 
    } 
}); 
+0

Спасибо. С тех пор я помещал его в папку с сервером, и у меня уже был код для обработки обратного вызова ошибки Meteor.call. Я врывался в источник для учетных записей, и 'createUser', похоже,« бросает новый Meteor.Error », если он терпит неудачу. Можно ли предположить, что эти ошибки будут отправлены по проводам на обратный вызов «Meteor.call», если они будут сброшены? К сожалению, 'sendEnrollmentEmail' просто« бросает новую ошибку ». –

+0

Я думаю, это именно то, что аргумент 'err' в обратном вызове предназначен для :) –

-3

Дайте пользователю пароль по умолчанию.

(я рекомендую использовать функцию check() внутри метода addUser. - замена некоторых из ваших if заявлений Кроме того, вам не нужно Meteor.isServer до тех пор, как вы положили JS-файл в папке /server.)

+0

Из соображений безопасности я не хочу, чтобы пароли по умолчанию. –

+0

Конечно, глобальный пароль небезопасен, но вы можете легко генерировать безопасные индивидуальные пароли для пользователей, чтобы их изменить позже. (PS Пожалуйста, не проголосуйте за ответ просто потому, что вы не согласны с ним - голосование за неправильные или нерелевантные ответы. Попытка помочь здесь;)) – dalgard

+0

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

Смежные вопросы