更新 Meteor.js 个用户帐户中的电子邮件地址

Updating the email address in Meteor.js user accounts

我今天使用 Meteor.js 和 Accounts-ui-bootstrap3 包解决了很多用户错误。到目前为止,我最喜欢的错误是密码重置时的 'Token Expired',但真正导致问题的错误是输入正确的电子邮件地址时的 'User Not Found'。花了一段时间才解决,但问题是由使用全部大写的电子邮件地址创建的帐户引起的。显然,帐户对电子邮件地址区分大小写。

虽然我已经将所有代码更新为小写的传入用户电子邮件,但我仍然需要修复现有用户。我创建了一个服务器方法来处理这个问题:

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: { : "usedtobetaller@fixemandhow.com" }
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)

编辑:

显然我有重复的电子邮件,因此帐户-UI 电子邮件区分大小写。完全有可能最终得到三个用户 bob@email.com、Bob@email.com 和 BOB@email.com。

我将此作为一个警示故事和一个在 Meteor 中更新电子邮件地址的简单示例

这个问题有点硬核,但是这段代码将阻止创建任何帐户(即使在服务器上),并且电子邮件地址要大写:

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

我做了一些测试,帐户包不允许您使用同一电子邮件创建两个用户(这不是 case-sensitive)。

我试过创建两个用户:"alex@email.com" 和 "Alex@email.com" 在第二次尝试时,我得到:"Email already exists."

我认为您的 mongo 搜索不正确:

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

'emails.address' 不是有效的搜索键,'emails' 是一个数组。

我认为正确的语法是:

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