2015-09-22 59 views
1

我有一個設置會話變量的方法:會議未能於Meteor.methods在服務器端定義但在客戶端

Meteor.methods({ 
    updateSomething: (k) => { 
     CollectionOfSomething.insert({ 
      k: k 
     }); 
     Session.set('latestSomething', CollectionOfSomething.findOne({ 
      k: k 
     }); 
    } 
}); 

接下來發生的事情是我的東西是矛盾的。由於方法在lib文件夾中定義(這是一種正確的方法),因此調用方法都會在客戶端和服務器上調用。在客戶端上,它會爲會話變量latestSomething生成新值,並且每次都刷新一次。但在服務器上,我收到一個異常:

Exception while invoking method 'updateSomething' ReferenceError: Session is not defined 

這個異常只是一個警告,並沒有殺死應用程序實例。但這似乎不是一個好習慣,所有這些消息填滿了服務器日誌沒有任何價值。

那我該怎麼辦?什麼是流星慣用的方法?

回答

4

Session對象僅在客戶端可用(請參閱http://docs.meteor.com/#/basic/session - 兩個函數定義框都表示爲「客戶端」)。您最好的選擇是return您的CollectionOfSomething.findOne()取回的結果,然後在客戶端的回調函數中使用Session.set

Session是一個短暫的對象,在硬頁面刷新時丟失,或者當用戶手動導航到不同的頁面時,因此在服務器上維護它是沒有任何意義的。

+0

「會議是失去了一個短暫的對象時重新加載頁面或路由變化」的全部目的'Session'的**完全不是**。 –

+0

@你好,你可以鏈接到該聲明的來源?像https://github.com/okgrow/meteor-persistent-session/這樣的包存在的原因是因爲Session變量只持續當前頁面的生命週期,因此名稱爲「Session」。 –

+2

'Session'是一個命名的全局'ReactiveDict',它被構建用來保持熱重載和路由變化。你的陳述充其量是非常不準確的。 –

4

您不能在服務器上使用會話。它意味着對客戶的反應。設置它的回調,像這樣:

Meteor.call('updateSomething', yourThing, function (err, id) { 
    if (!err) { 
    Session.set('somevar', id); 
    } 
}) 

您的流星方法看起來像這樣

Meteor.methods({ 
    updateSomething: function (thing) { 
    return MyCollection.insert(thing); // returns the id 
    } 
});