2014-09-11 19 views
0

在我的客戶我有以下代碼Serverside集團方法拋出的方法調用的錯誤,而不是在客戶端

# If clicking on unit while target is set, activates action 
    'click .actor':() -> 
    character = Meteor.user().character() 
    target = Session.get('target') 
    skill = Session.get('selectedSkill') 

    if target and skill 
     console.log character.battle() 
     Meteor.call('useSkill', skill, character, target, (err) -> 
     if err then console.log err.reason 
    ) 

在這裏,當我調用character.battle(),它正確地返回戰場文件。但是,當我調用相同的方法,對同一對象,在useSkill()方法,它引發以下錯誤

Exception while invoking method 'useSkill' TypeError: Object #<Object> has no method 'battle' 

Serverside集團法

useSkill: (skill, actor, target) -> 
    cost = skill.cost 

    console.log "battle: #{actor.battle()}" 
    .... 

和聯想的battle()「的方法

@Characters = new Meteor.Collection('characters', 
    transform: (entry) -> 

     entry.battle =() -> 
      Battles.findOne({active: true, $or: [{characterOneId: this._id}, {characterTwoId: this._id}]}) 

     return entry 
) 
+0

你宣佈對'server'和''client'收集Characters'? – 2014-09-11 10:22:43

+0

我聲明它在一個lib文件夾中,所以它應該在 – Tarlen 2014-09-11 10:26:21

回答

1

您只能傳遞可序列化的對象作爲方法參數。換句話說,當你通過這樣的actor參數時,你在客戶端添加的所有自定義方法都不會被保留。要訪問服務器上的自定義功能,您需要在服務器上創建對象。

因此,而不是通過整個character對象,只是通過其_id並再次找到它裏面的方法:

useSkill: (skill, actorId, target) -> 
    actor = Characters.findOne actorId 
    ... 
    console.log "battle: #{actor.battle()}" 
+0

上可用無論如何,這是一個更好的方法,因爲它可以節省帶寬。 – 2014-09-11 10:47:37

+0

應該不會傳遞任何東西,但_id是流星服務器方法調用? – Tarlen 2014-09-11 11:04:28

+0

那麼,你通常不應該傳遞你可以在服務器上獲取的整個數據庫項目 - 在這種情況下,最好傳遞'_id'。然而,通常你會傳遞其他東西,就像你想插入的整個對象(所以它不在數據庫中)。 – 2014-09-11 11:20:31

0

功能不被EJSON序列化和沒有結束DDP發送。 在性格Meteor.call通ID:

Meteor.call('useSkill', skill, character._id, target, (err) -> 
    if err then console.log err.reason 
) 

useSkill方法查找演員:

useSkill: (skill, actorId, target) -> 
    cost = skill.cost 
    actor = Characters.findOne actorId 
    console.log "battle: #{actor.battle()}" 
相關問題