【问题标题】:Updating current user's email address in Meteor在 Meteor 中更新当前用户的电子邮件地址
【发布时间】:2017-12-01 00:07:54
【问题描述】:

我在更新 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 更新 - 或者至少我认为我是。

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

有没有办法只用客户端代码来解决这个问题?

(我意识到我还需要将“已验证”密钥重置为 false,但我猜这是另一个问题)

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

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

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

    客户端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;
      }
    });
    

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

    【讨论】:

    • 这很完美!我只需要在服务器代码的右括号之前添加另一个右括号。也许你可以用它来编辑你的答案,我会接受/支持它。
    • 添加了右大括号
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多