Обновление адреса электронной почты в учетных записях пользователей Meteor.js

Сегодня я устранял множество пользовательских ошибок, используя Meteor.js и пакет Accounts-ui-bootstrap3. До сих пор моей любимой ошибкой является «Срок действия токена» при сбросе пароля, но проблема, которая действительно вызывает проблемы, — «Пользователь не найден» при вводе правильного адреса электронной почты. Это заняло некоторое время, но проблема в том, вызвано учетными записями, созданными с адресом электронной почты, написанным заглавными буквами. Очевидно, учетные записи чувствительны к регистру для адресов электронной почты.

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

Meteor.methods({
  sanitizeEmails: function() {
    Meteor.users.find({
      'emails.address': /[A-Z]{1,}/
    }).map(function(user) {
      console.log(user.emails[0].address);
      Meteor.users.update({
        _id: user._id
      }, {
        $set: {
          'emails.0.address': user.emails[0].address.toLowerCase()
        }
      });
    });
  }
});

Который должен пройти, найти любые имена с буквой в верхнем регистре и обновить адрес электронной почты до версии в нижнем регистре. Это не работает, выдает ошибку индекса в драйвере MongoDB:

I20150904-01:30:23.322(-7)? Exception while invoking method 'normalizeEmails' MongoError: E11000 duplicate key error index: meteor.users.$emails.address_1  dup key: { : "[email protected]" }
I20150904-01:30:23.322(-7)?     at Object.Future.wait (/home/mowgli/.meteor/packages/meteor-tool/.1.1.4.70jrul++os.linux.x86_64+web.browser+web.cordova/mt-os.linux.x86_64/dev_bundle/server-lib/node_modules/fibers/future.js:398:15)
I20150904-01:30:23.323(-7)?     at [object Object].<anonymous> (packages/meteor/helpers.js:119:1)
I20150904-01:30:23.323(-7)?     at [object Object].MongoConnection.(anonymous function) [as update] (packages/mongo/mongo_driver.js:678:1)
I20150904-01:30:23.323(-7)?     at [object Object].Mongo.Collection.(anonymous function) [as update] (packages/mongo/collection.js:575:1)
I20150904-01:30:23.323(-7)?     at server/main.invitePub.coffee:320:22
I20150904-01:30:23.323(-7)?     at packages/mongo/mongo_driver.js:974:1
I20150904-01:30:23.323(-7)?     at [object Object]._.extend.forEach (packages/mongo/mongo_driver.js:965:1)
I20150904-01:30:23.323(-7)?     at [object Object]._.extend.map (packages/mongo/mongo_driver.js:973:1)
I20150904-01:30:23.323(-7)?     at [object Object].Cursor.(anonymous function) [as map] (packages/mongo/mongo_driver.js:812:1)
I20150904-01:30:23.324(-7)?     at [object Object].Meteor.methods.normalizeEmails (server/main.invites.coffee:317:56)
I20150904-01:30:23.324(-7)?     - - - - -
I20150904-01:30:23.324(-7)?     at Object.toError (/home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/utils.js:114:11)
I20150904-01:30:23.324(-7)?     at /home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/collection/core.js:577:27
I20150904-01:30:23.324(-7)?     at /home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1195:7
I20150904-01:30:23.324(-7)?     at /home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/db.js:1903:9
I20150904-01:30:23.324(-7)?     at Server.Base._callHandler (/home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/base.js:453:41)
I20150904-01:30:23.324(-7)?     at /home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/server.js:487:18
I20150904-01:30:23.324(-7)?     at [object Object].MongoReply.parseBody (/home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
I20150904-01:30:23.325(-7)?     at [object Object].<anonymous> (/home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/server.js:445:20)
I20150904-01:30:23.325(-7)?     at [object Object].emit (events.js:95:17)
I20150904-01:30:23.325(-7)?     at [object Object].<anonymous> (/home/mowgli/.meteor/packages/mongo/.1.1.0.zb7oxo++os+web.browser+web.cordova/npm/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:207:13)

РЕДАКТИРОВАТЬ:

По-видимому, у меня есть повторяющиеся электронные письма, поэтому электронные письма Accounts-UI чувствительны к регистру. Вполне возможно получить трех пользователей [email protected], [email protected] и [email protected].

Я оставлю это как поучительную историю и простой пример обновления адресов электронной почты в Meteor.


person MrMowgli    schedule 04.09.2015    source источник


Ответы (2)


Это немного хардкорно для этой проблемы, однако этот код предотвратит создание ЛЮБОЙ учетной записи (даже на сервере) с заглавными буквами в адресе электронной почты:

if (Meteor.isServer) {
  Accounts.validateNewUser(function(user) {
    if (user.emails[0].address.match(/[A-Z]{1,}/) {
      throw new Meteor.Error(403, "Emails may only be lowercase.");
      return false;
    }
    return true;
  });
}
person MrMowgli    schedule 04.09.2015

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

Я пробовал создать двух пользователей: «[email protected]» и «[email protected]». При второй попытке получаю: «Электронная почта уже существует».

Я думаю, что ваш поиск монго неверен:

Meteor.users.find({
    'emails.address': /[A-Z]{1,}/
})

«emails.address» не является допустимым ключом для поиска, «emails» — это массив.

Я думаю, что правильный синтаксис будет:

Meteor.users.find({
    emails: {
        $elemMatch: {
            address: /[A-Z]{1,}/
        }
    }
})
person Alex Tondello    schedule 10.01.2016
comment
Спасибо, да поймал это позже. Я не проверял, существует ли проблема, но проблема, с которой я столкнулся, заключалась в том, что у меня уже были дубликаты адресов электронной почты, с той лишь разницей, что регистр регистрировался в системе, и я отследил их до Accounts.createUser(). Весь этот код сейчас довольно сильно изменился, поэтому я не очень ожидаю, что это произойдет в последних выпусках. - person MrMowgli; 12.01.2016