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获取固定项目并按照说明获取并运行它。
主要问题是:
- 在您集合的架构定义中,您首先指定了 UserSchema 并引用了 UserProfile 架构。由于在您引用它时 UserProfile 不存在,因此代码会自动失败。也许您与包所有者一起解决这个问题,以获得更好的错误和参考检查处理。
- 你绝对应该阅读 meteor 的数据绑定,因为在 profile.html 模板下你犯了很多错误
- 在创建用户时初始化您的个人资料架构:
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;
});
- 公开您的自定义配置文件的已发布字段
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
}
});
}
- 您将要查看的一般流星/JS 编码标准问题
- 在将其投入生产之前,您还需要检查其他事项,例如变量作用域、单元测试、性能等。
作为一般规则(至少根据我的经验),我总是从最低限度开始,避免在手头没有坚实的框架基础的情况下使用复杂的包。这会在以后为您省去很多像这样的调试和挫折:)。
请在验证后接受此答案,以便我可以从我的 github 帐户中再次删除它 .
祝你好运。
我正在构建一个 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获取固定项目并按照说明获取并运行它。
主要问题是:
- 在您集合的架构定义中,您首先指定了 UserSchema 并引用了 UserProfile 架构。由于在您引用它时 UserProfile 不存在,因此代码会自动失败。也许您与包所有者一起解决这个问题,以获得更好的错误和参考检查处理。
- 你绝对应该阅读 meteor 的数据绑定,因为在 profile.html 模板下你犯了很多错误
- 在创建用户时初始化您的个人资料架构:
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;
});
- 公开您的自定义配置文件的已发布字段
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
}
});
}
- 您将要查看的一般流星/JS 编码标准问题
- 在将其投入生产之前,您还需要检查其他事项,例如变量作用域、单元测试、性能等。
作为一般规则(至少根据我的经验),我总是从最低限度开始,避免在手头没有坚实的框架基础的情况下使用复杂的包。这会在以后为您省去很多像这样的调试和挫折:)。
请在验证后接受此答案,以便我可以从我的 github 帐户中再次删除它 .
祝你好运。