2013-11-03 45 views
4

我收到提示與Meteor.js這段代碼:Meteor.methods()回調錯誤

客戶端:

 Meteor.call("logUser", function(myvar){ 
     console.log("le chat client : "+myvar) ; 
     Session.set("chatId", myvar); 
    }); 

服務器端:

Meteor.methods({ 
     logUser : function(mycallback){ 
     mycallback("myString"); 
     } 
    }); 

我不真的明白爲什麼它不起作用,方法很好地觸發,但是當調用「mycallback」時代碼會中斷:

「未定義不是函數」

回答

5

解決方案:

客戶端:

Meteor.call("logUser", function(error , result){ 
     if(error) 
     else 
     console.log(myvar) ; 

    }); 

服務器端:

Meteor.methods({ 
    logUser : function(){ 
    return "myString"; 
    } 

});

5

您不能將函數作爲參數傳遞給Meteor方法。

這是爲什麼?

  • 出於安全考慮,你是否知道基本上你試圖讓客戶端在服務器端上下文中執行任何代碼?你不能相信客戶端,有人可以使用Meteor.call(「logUser」,function(){破壞你的服務器的惡意代碼});在瀏覽器控制檯中,並在一行代碼中殺死你的服務器!

  • 我猜Meteor.call的參數是使用JSON格式進行序列化的,JSON格式不允許使用函數,所以這在技術上是不可能的。您可以將該函數作爲字符串傳遞並在服務器上對其進行評估,但那將是一個可怕的錯誤!

這裏會發生什麼事是你傳遞給Meteor.call功能確實視爲方法的異步執行後,客戶端上執行的回調已經在服務器上執行的,所以這就是爲什麼你欺騙性地認爲該方法被很好地觸發,而顯然不是這種情況。

因此,流星方法根本沒有傳遞任何參數,這就是爲什麼在其代碼中未定義「回調」。

引述流星文檔:(http://docs.meteor.com/#meteor_call

「如果你有一個回調函數作爲最後一個參數(它不能成爲一個參數的方法,因爲函數是不可序列化),該方法將異步運行「。

所以你在這裏做錯了什麼(服務器上無法提供Session),我認爲你應該重新考慮這個方法。

+0

幾分鐘前我找到了解決方案,感謝您的幫助! – Lombric