在Meteor中更新当前用户的电子邮件地址

时间:2017-12-01 00:07:54

标签: mongodb meteor

我在更新Meteor中当前用户的电子邮件地址时遇到问题。问题代码在这里(它是所有客户端代码):

var id = Meteor.userId();
if (firstName) {
Meteor.users.update(
    { _id: id }, 
    { $set: { "profile.firstName": firstName }}
)};
if (lastName)  {
Meteor.users.update(
    { _id: id }, 
    { $set: { "profile.lastName":  lastName  }}
)};    
var oldEmail = Meteor.user().emails[0].address;
if (newEmail) {
Meteor.users.update(
    { _id: id, 'emails.0.address': oldEmail }, 
    { $set: { 'emails.0.address': newEmail }}
)};

前两行工作正常(用户可以更新他们的名字和姓氏),但最后一次更新失败,并在控制台中显示以下错误: " errorClass {isClientSafe:true,错误:403,原因:"不允许。不受信任的代码只能按ID更新文档。"

我不理解错误,因为我 AM 按ID更新 - 或者至少我认为我是。

另外:如果我删除对旧电子邮件的引用,我会得到一个简单的"更新失败。访问被拒绝"控制台中的错误而不是上述错误。

有没有办法只使用客户端代码修复此问题?

(我意识到我还需要将"已验证的"密钥重置为假,但我认为这是一个不同的问题)

1 个答案:

答案 0 :(得分:0)

不要直接编辑emails数组。 Accounts包具有此用例的实用程序功能,请参阅Accounts.addEmailAccounts.removeEmail

首先,您需要调用Method,因为必须在服务器上执行这些功能。

客户js:

if (newEmail) {
  Meteor.call('updateEmail', newEmail, err => {
    if (err) console.log(`Error updating email address: {err}`);
  });
}

服务器:

Meteor.methods({
  updateEmail(newAddress) {
    const userId = this.userId;
    if (userId) {
      const currentEmail = Meteor.users.findOne(userId).emails[0].address;
      Accounts.addEmail(userId, newAddress);
      Accounts.removeEmail(userId, currentEmail)
    }
    return;
  }
});

您还应该在您的方法中验证新电子邮件地址是具有电子邮件地址模式的字符串。