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

时间:2015-03-01 14:36:37

标签: collections meteor updates

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

模板

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

一切正常:在提交时,函数获取字段值,在服务器上调用方法,成功传递字段值。更新似乎工作,因为没有抛出任何错误。但是,&#39; profile.firstName&#39;返回undefined并且不会显示在我的模板中。

我使用的是基于帐户的包和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
    }
});

我完全不知道出了什么问题,并希望得到一切帮助!

2 个答案:

答案 0 :(得分:1)

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

请从 here 获取修复后的项目,然后按照说明进行操作。

主要问题是:

  1. 在集合的架构定义中,您首先指定了UserSchema并引用了UserProfile架构。由于UserProfile在您引用它时不存在,因此代码无声地失败。也许您可以通过软件包所有者解决此问题,以获得更好的错误和参考检查处理。
  2. 你一定要阅读meteor的数据绑定,因为在profile.html模板下你犯了很多错误
  3. 在用户创建时初始化您的个人资料架构:
  4. 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. 公开自定义配置文件的已发布字段
    2. 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. 您想要审核的一般meteor / JS编码标准问题
      2. 在您开始制作之前,还有其他一些您想要检查的内容,例如变量范围,单元测试,性能等。
      3. 作为一般规则(至少根据我的经验),我总是从最低限度开始,避免使用复杂的软件包而没有坚实的框架基础。这将在未来为您节省大量的调试和挫折:)。

        请在验证后立即接受此答案,以便我可以从我的github帐户再次将其删除

        祝你好运。

答案 1 :(得分:0)

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

用户详细信息模板标记

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

Result