使用 Meteor js 将记录保存到 Mongo 数据库中的同一集合中
Save records into the same collection in Mongo DB using Meteor js
作为 Meteor JS 的新手,我对如何更新记录感到困惑。我有 2 个模板 AddSchoolLayout 和 Schoolcontactlayout,AddSchoollayout 在 Mongo 数据库中创建记录,现在,对于同一所学校,我想在同一数据库 NewSchoolDB 上添加它的地址,但是当我尝试这个时,我不断收到以下错误错误的ID。我有什么错?
请注意,我的语言可能与 Mongo 的语言不相关;我还很新鲜,来自 SQL 背景。
这是保存记录的method.js。
//methods.js
if (Meteor.isServer) {
Meteor.methods({
SchoolRegister: function (phone, schoolemail) {
if (!Meteor.userId()) {
throw new Meteor.error('Not authorized');
return false;
}else{
NewSchoolDB.insert({
authorId: Meteor.userId(),
phone: phone,
schoolemail
});
}
}
});
}
这是拯救新学校的活动
//add school
Template.AddSchoolLayout.events({
'submit .addnewschool': function (event, template) {
event.preventDefault();
var newschoolname = trimInput(event.target.newschoolname.value);
if (isNotEmpty(newschoolname)) {
Meteor.call('SchoolRegister', newschoolname,
function (error, response) {
if (error) {
Bert.alert(error.reason, 'danger', 'growl-top-right');
return false;
}else{
Bert.alert("School successfully created", "success", "growl-top-right");
FlowRouter.redirect('/schoolcontact');
}
});
}
return false;
}
});
这是我要更新学校地址的地方
//school contact
Template.SchoolContactLayout.events({
'submit .contactschool': function (event) {
event.preventDefault();
var phone = trimInput(event.target.phone.value);
if (isNotEmpty(phone)) {
Meteor.call('SchoolRegister', phone, function (error, response) {
if (error) {
Bert.alert(error.reason, 'danger', 'growl-top-right');
return false;
}else{
Bert.alert('School address updated successfully', 'success', 'growl-top-right');
FlowRouter.redirect('/logo-upload');
}
});
}
return false;
}
});
控制台记录错误
I20170524-17:44:14.051(1)? at packages/ddp-server/livedata_server.js:559:43
I20170524-17:51:54.678(1)? Exception from sub NewSchoolDB id onFTu2j3xRmbqC5WF TypeError: this.userId is not a function
I20170524-17:51:54.710(1)? at [object Object]._handler (lib/pulbish/published.js:3:13)
I20170524-17:51:54.712(1)? at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1737:12)
I20170524-17:51:54.713(1)? at [object Object]._.extend._runHandler (packages/ddp-server/livedata_server.js:1035:17)
I20170524-17:51:54.714(1)? at [object Object]._.extend._startSubscription (packages/ddp-server/livedata_server.js:853:9)
I20170524-17:51:54.715(1)? at [object Object]._.extend.protocol_handlers.sub (packages/ddp-server/livedata_server.js:625:12)
I20170524-17:51:54.719(1)? at packages/ddp-server/livedata_server.js:559:43
您的 SchoolRegister 方法接受 2 个参数:phone
和 schoolmail
。当您创建学校时,您使用一个名为 newschoolname
的参数调用方法。所以你的命名约定有问题,但对于你的问题应该无关紧要。
使用 MongoDB,您可以使用插入将新记录添加到 collection。如果需要更新它,请使用更新。因此,解决您的问题的一种方法是:
- 在AddSchoolLayout 中,第一次调用您的方法插入文档。
NewSchoolDB.insert(...)
将 return 创建记录的 ID。保留该 ID 并将其传递到您的下一页,例如 URL.
在您的下一页 SchoolContactLayout
中,您需要调用一个新方法来更新您的学校,使用上一个方法 return 编辑的 ID。这个新方法看起来像这样:
SchoolUpdate: function (schoolId, phone) {
if (!Meteor.userId()) {
throw new Meteor.error('Not authorized');
return false;
}else{
NewSchoolDB.update(schoolId, { $set: { phone } });
}
}
update MongoDB 函数的第一个参数是要更新的记录的 ID。第二个参数是您要用于更新记录的修饰符。以下是您可以使用的修饰符的完整列表:update modifiers
编辑:如何将 ID 从一种布局传递到另一种布局:
我有一段时间没有使用 FlowRouter,现在无法对其进行测试,因此您可能需要进行一些更正,但我将通过以下方式为您提供一个想法:
首先你需要用这样的东西定义你的路线SchoolContactLayout
:
FlowRouter.route('/schoolcontact/:schoolId', {
name: 'schoolContact',
});
这会向路由添加一个 schoolId
参数。
在您的 SchoolRegister 方法中,获取 return ID 和 return 它:
var id = NewSchoolDB.insert({
authorId: Meteor.userId(),
schooleName
});
return { id }
编辑重定向 FlowRouter.redirect('/schoolcontact');
为 FlowRouter.go('/schoolcontact/' + response.id);
然后您可以使用如下内容编辑您的 contactSchool 事件:
Template.SchoolContactLayout.events({
'submit .contactschool': function (event) {
event.preventDefault();
var schoolId = FlowRouter.getParam('schoolId');
var phone = trimInput(event.target.phone.value);
if (isNotEmpty(phone)) {
Meteor.call('SchoolUpdate', schoolId ,phone, function (error, response) {
if (error) {
Bert.alert(error.reason, 'danger', 'growl-top-right');
return false;
}else{
Bert.alert('School address updated successfully', 'success',
'growl-top-right');
FlowRouter.redirect('/logo-upload');
}
});
}
return false;
}
});
注意 var schoolId = FlowRouter.getParam('schoolId');
从 URL 参数中获取 ID,以便我可以在更新方法中使用它。
作为 Meteor JS 的新手,我对如何更新记录感到困惑。我有 2 个模板 AddSchoolLayout 和 Schoolcontactlayout,AddSchoollayout 在 Mongo 数据库中创建记录,现在,对于同一所学校,我想在同一数据库 NewSchoolDB 上添加它的地址,但是当我尝试这个时,我不断收到以下错误错误的ID。我有什么错?
请注意,我的语言可能与 Mongo 的语言不相关;我还很新鲜,来自 SQL 背景。
这是保存记录的method.js。
//methods.js
if (Meteor.isServer) {
Meteor.methods({
SchoolRegister: function (phone, schoolemail) {
if (!Meteor.userId()) {
throw new Meteor.error('Not authorized');
return false;
}else{
NewSchoolDB.insert({
authorId: Meteor.userId(),
phone: phone,
schoolemail
});
}
}
});
}
这是拯救新学校的活动
//add school
Template.AddSchoolLayout.events({
'submit .addnewschool': function (event, template) {
event.preventDefault();
var newschoolname = trimInput(event.target.newschoolname.value);
if (isNotEmpty(newschoolname)) {
Meteor.call('SchoolRegister', newschoolname,
function (error, response) {
if (error) {
Bert.alert(error.reason, 'danger', 'growl-top-right');
return false;
}else{
Bert.alert("School successfully created", "success", "growl-top-right");
FlowRouter.redirect('/schoolcontact');
}
});
}
return false;
}
});
这是我要更新学校地址的地方
//school contact
Template.SchoolContactLayout.events({
'submit .contactschool': function (event) {
event.preventDefault();
var phone = trimInput(event.target.phone.value);
if (isNotEmpty(phone)) {
Meteor.call('SchoolRegister', phone, function (error, response) {
if (error) {
Bert.alert(error.reason, 'danger', 'growl-top-right');
return false;
}else{
Bert.alert('School address updated successfully', 'success', 'growl-top-right');
FlowRouter.redirect('/logo-upload');
}
});
}
return false;
}
});
控制台记录错误
I20170524-17:44:14.051(1)? at packages/ddp-server/livedata_server.js:559:43
I20170524-17:51:54.678(1)? Exception from sub NewSchoolDB id onFTu2j3xRmbqC5WF TypeError: this.userId is not a function
I20170524-17:51:54.710(1)? at [object Object]._handler (lib/pulbish/published.js:3:13)
I20170524-17:51:54.712(1)? at maybeAuditArgumentChecks (packages/ddp-server/livedata_server.js:1737:12)
I20170524-17:51:54.713(1)? at [object Object]._.extend._runHandler (packages/ddp-server/livedata_server.js:1035:17)
I20170524-17:51:54.714(1)? at [object Object]._.extend._startSubscription (packages/ddp-server/livedata_server.js:853:9)
I20170524-17:51:54.715(1)? at [object Object]._.extend.protocol_handlers.sub (packages/ddp-server/livedata_server.js:625:12)
I20170524-17:51:54.719(1)? at packages/ddp-server/livedata_server.js:559:43
您的 SchoolRegister 方法接受 2 个参数:phone
和 schoolmail
。当您创建学校时,您使用一个名为 newschoolname
的参数调用方法。所以你的命名约定有问题,但对于你的问题应该无关紧要。
使用 MongoDB,您可以使用插入将新记录添加到 collection。如果需要更新它,请使用更新。因此,解决您的问题的一种方法是:
- 在AddSchoolLayout 中,第一次调用您的方法插入文档。
NewSchoolDB.insert(...)
将 return 创建记录的 ID。保留该 ID 并将其传递到您的下一页,例如 URL. 在您的下一页
SchoolContactLayout
中,您需要调用一个新方法来更新您的学校,使用上一个方法 return 编辑的 ID。这个新方法看起来像这样:SchoolUpdate: function (schoolId, phone) { if (!Meteor.userId()) { throw new Meteor.error('Not authorized'); return false; }else{ NewSchoolDB.update(schoolId, { $set: { phone } }); } }
update MongoDB 函数的第一个参数是要更新的记录的 ID。第二个参数是您要用于更新记录的修饰符。以下是您可以使用的修饰符的完整列表:update modifiers
编辑:如何将 ID 从一种布局传递到另一种布局:
我有一段时间没有使用 FlowRouter,现在无法对其进行测试,因此您可能需要进行一些更正,但我将通过以下方式为您提供一个想法:
首先你需要用这样的东西定义你的路线SchoolContactLayout
:
FlowRouter.route('/schoolcontact/:schoolId', {
name: 'schoolContact',
});
这会向路由添加一个 schoolId
参数。
在您的 SchoolRegister 方法中,获取 return ID 和 return 它:
var id = NewSchoolDB.insert({
authorId: Meteor.userId(),
schooleName
});
return { id }
编辑重定向 FlowRouter.redirect('/schoolcontact');
为 FlowRouter.go('/schoolcontact/' + response.id);
然后您可以使用如下内容编辑您的 contactSchool 事件:
Template.SchoolContactLayout.events({
'submit .contactschool': function (event) {
event.preventDefault();
var schoolId = FlowRouter.getParam('schoolId');
var phone = trimInput(event.target.phone.value);
if (isNotEmpty(phone)) {
Meteor.call('SchoolUpdate', schoolId ,phone, function (error, response) {
if (error) {
Bert.alert(error.reason, 'danger', 'growl-top-right');
return false;
}else{
Bert.alert('School address updated successfully', 'success',
'growl-top-right');
FlowRouter.redirect('/logo-upload');
}
});
}
return false;
}
});
注意 var schoolId = FlowRouter.getParam('schoolId');
从 URL 参数中获取 ID,以便我可以在更新方法中使用它。