2017-05-24 70 views
0

我有这种情况,我一直在尝试解决。作为Meteor JS的新手,我很困惑如何更新记录。我有2个模板AddSchoolLayout和Schoolcontactlayout,AddSchoollayout在Mongo数据库中创建记录,现在,为同一所学校我想添加它的地址仍然在同一个数据库NewSchoolDB,但当我试着这个我不断收到关于错误ID的错误。我错了什么?我会很感激得到一个快速的专业帮助。谢谢。对不起,我的语言可能与Mongo不相关,我还是新鲜的,来自SQL背景。使用Meteor js将记录保存到Mongo DB的相同集合中

这是记录被保存的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 
+0

我认为你的问题是在本质上是服务器上下文中使用Meteor.userID。这可能会产生问题,请阅读:https://guide.meteor.com/accounts.html#current-user – mstorkson

回答

1

您的学校注册方法接受2个参数:phoneschoolmail。当您创建学校时,您将调用一个名为newschoolname的参数。所以你的命名约定有些问题,但是关于你的问题应该没关系。

使用MongoDB,您可以使用insert将新记录添加到集合中。如果您需要更新它,请使用更新。所以解决你的问题的一种方法是:

  • 在AddSchoolLayout中,调用你的方法在第一次插入文档。 NewSchoolDB.insert(...)将返回创建的记录的ID。保留该ID并将其传递到下一页,例如在URL中。
  • 在你的下一页,SchoolContactLayout,你需要调用一个新的方法来更新你的学校,使用前面的方法返回的ID。这种新方法会是这个样子:

    SchoolUpdate: function (schoolId, phone) { 
        if (!Meteor.userId()) { 
         throw new Meteor.error('Not authorized'); 
         return false; 
        }else{ 
         NewSchoolDB.update(schoolId, { $set: { phone } }); 
        } 
    } 
    

更新的MongoDB函数的第一个参数是要更新的记录的ID。第二个参数是你想用来更新记录的修饰符。下面是修改的完整列表,你可以使用:update modifiers

编辑:如何从一个布局ID传递到另一个:

我没有使用FlowRouter了一段时间,我无法测试它现在,所以你可能需要做一些修正,但这里是我会怎么做,给你一个想法:

首先,你需要的是这样定义你的路线SchoolContactLayout

FlowRouter.route('/schoolcontact/:schoolId', { 
    name: 'schoolContact', 
}); 

这会为路由添加schoolId参数。

在你SchoolRegister方法,得到返回的ID,并将其返回:

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,以便我可以在更新中使用它m ethod。

+0

谢谢。这是正确的方向,我的下一个问题是如何通过ID。它应该在会议中吗? – kehinde

+1

我编辑了答案给你一个想法。 –

+0

非常感谢。我使用会话来获取id,因为它是一个全局变量并被检索。有效。这有什么副作用? – kehinde