2017-05-24 61 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