Meteor:配置文件更新神秘失败

Meteor: Profile update fails mysteriously

我正在构建一个 Meteor 应用程序并希望用户能够 update/set 他们的名字。我已经设置了代码,一切似乎都在工作,只是它在更新时神秘地失败了。这是我的代码:

模板

<template name="_editName">
  {{#ionModal focusFirstInput=true customTemplate=true}}
    <form id="updateName">
      <div class="bar bar-header bar-stable">
        <button data-dismiss="modal" type="button" class="button button-clear button-assertive">Cancel</button>
        <h2 class="title">Update your name</h2>
        <button type="submit" class="button button-positive button-clear">Save</button>
      </div>
      <div class="content has-header overflow-scroll list">
        <label class="item item-input">
          <input type="text" id="firstName" placeholder="Given Name">
        </label>
        <label class="item item-input">
          <input type="text" id="lastName" placeholder="Surname">
        </label>
      </div>
    </form>
  {{/ionModal}}
</template>

客户端代码

Template._editName.events({
  'submit #updateName': function(event, template) {
    event.preventDefault();
    console.log('Submitted');
    var firstName = document.getElementById('firstName').value;
    var lastName = document.getElementById('lastName').value;

    Meteor.call('editName', firstName, lastName, function(error) {
      if (error) {      
        throw new Error(error.reason);
      } else {
        Router.go('profile');
      }
    });
    IonModal.close();
    IonKeyboard.close();
  }
});

服务器端代码

Meteor.methods({
    'editName': function(firstName, lastName) {
        console.log(firstName); // returns expected value
        console.log(lastName); // returns expected value
        Meteor.users.update({_id: this.userId}, {$set: {
            'profile.firstName': firstName,
            'profile.lastName': lastName
        }});
        Meteor.users.findOne({_id: this.userId}, {fields: {
        'profile.firstName': 1, _id: 0}}); // returns undefined
    }
});

一切正常:提交时,函数获取字段值,调用服务器上的方法,成功传递字段值。更新 似乎 正常工作,因为没有抛出任何错误。但是,'profile.firstName' returns 未定义并且没有出现在我的模板中。

我正在使用 accounts-base 包和 aldeed:collection2。我设置了以下架构:

Schema.UserProfile = new SimpleSchema({
    firstName: {
        type: String,
        regEx: /^[a-zA-Z-]{2,25}$/,
        optional: true
    },
    lastName: {
        type: String,
        regEx: /^[a-zA-Z]{2,25}$/,
        optional: true
    }
});

我完全不知道出了什么问题,非常感谢您的帮助!

请参阅下面我的工作示例代码供您参考:

用户详细信息模板标记

      {{#with currUser}}
        <form class="edit-todo" id="edit-user">
          Username:
          <input type="text" name="username" value="{{profile.name}}" />
          Firstname:
          <input type="text" name="firstname" value="{{profile.firstname}}" />
          Lastname:
          <input type="text" name="lastname" value="{{profile.lastname}}" />
          <button type="submit" style="width: 100px;height:50px">Save user</button>
        </form>
      {{/with}}

用户详细信息模板代码

Template.UsersDetail.events({
    'submit form#edit-user': function(e, tmpl) {
        e.preventDefault();

        var firstname = tmpl.find('input[name=firstname]').value;
        var lastname = tmpl.find('input[name=lastname]').value;
        var userId = Meteor.userId();

        Meteor.call('editName', userId, firstname, lastname, function(error) {
            if (error) {
                throw new Error(error.reason);
            } else {
                Router.go('users.detail', {
                    _id: userId
                });
            }
        });
    }
});
Template.UsersDetail.helpers({
    currUser: function() {
        return Meteor.users.findOne({
            _id: Meteor.userId()
        });
    }
});

名称更新的服务器方法

/*****************************************************************************/
/* Server Only Methods */

Meteor.methods({
    'editName': function(userId, firstName, lastName) {
        Meteor.users.update({_id: userId}, {$set: {
            'profile.firstname': firstName,
            'profile.lastname': lastName
        }});
        console.log(Meteor.users.findOne({_id: this.userId}).profile.lastname);// returns the proper name
    }
});

我检查了您的代码,发现 多个问题 需要您注意。

请从here获取固定项目并按照说明获取并运行它。

主要问题是:

  1. 在您集合的架构定义中,您首先指定了 UserSchema 并引用了 UserProfile 架构。由于在您引用它时 UserProfile 不存在,因此代码会自动失败。也许您与包所有者一起解决这个问题,以获得更好的错误和参考检查处理。
  2. 你绝对应该阅读 meteor 的数据绑定,因为在 profile.html 模板下你犯了很多错误
  3. 在创建用户时初始化您的个人资料架构:
Accounts.onCreateUser(function(options, user) {
  // We're enforcing at least a profile skeleton object to avoid needing to check
  // for its existence later.
  // this file should reside on Server (e.g.  [root]/server/accounts.js)
  profile = {
    firstName: '',
    lastName: '',
    birthday: '',
    sex: '',
    grade: '',
    country: '',
    hostel: '',
    house:''
  }

  user.profile = profile;

  return user;
});
  1. 公开您的自定义配置文件的已发布字段
Meteor.publish('userProfile', function() {
  if(!this.userId) { 
    return null
  } else {
    return Meteor.users.find({_id: this.userId}, {
      fields: {
        username: 1,
        'profile.firstName': 1,
        'profile.birthday': 1,
        'profile.sex': 1,
        'profile.grade': 1,
        'profile.country': 1,
        'profile.hostel': 1,
        'profile.house': 1
      }
    });
  }
  1. 您将要查看的一般流星/JS 编码标准问题
  2. 在将其投入生产之前,您还需要检查其他事项,例如变量作用域、单元测试、性能等。

作为一般规则(至少根据我的经验),我总是从最低限度开始,避免在手头没有坚实的框架基础的情况下使用复杂的包。这会在以后为您省去很多像这样的调试和挫折:)。

请在验证后接受此答案,以便我可以从我的 github 帐户中再次删除它 .

祝你好运。