2015-05-27 117 views
2

我想知道爲什麼我調用流星服務器方法時出現錯誤。它在服務器端工作,但它在瀏覽器中拋出錯誤。流星呼叫和延遲補償

這是我的服務器代碼/server/methods.js文件:

Meteor.methods({ 
    getTicketSettings: function(){ 
     var getTicketConfig = function(callback){ 
      Assets.getText('ticketCustomizing.json', function(error, res){ 
       if (error) 
        throw new Meteor.Error({error:'ticket-getCustomizing', reason:'No se pudo recuperar la configuración.'}); 
       else callback && callback(null, JSON.parse(res)); 
      }); 
     } 

     var syncAssetRetrieve = Meteor.wrapAsync(getTicketConfig); 
     var result = syncAssetRetrieve(); 
     return result; 
    }, 
}); 

這是我的客戶機/服務器代碼/lib/initialization.js文件:

App.config.tickets.tipos = new Mongo.Collection('tipos'); 

Meteor.startup(function(){ 
    moment.locale('es'); 

    var ticketSettingsObj = Meteor.call('getTicketSettings'); 
    console.log(ticketSettingsObj); 

    _.map(ticketSettingsObj.tipos, function(tipo){ 
     App.config.tickets.tipos.insert(tipo); 
    }); 
}); 

當我運行我的應用程序時,我在控制檯中記錄了JSON對象,但瀏覽器顯示此錯誤:未捕獲的TypeError:無法讀取未定義的屬性'tipos'在我/lib/initialization.js這裏:

_.map(ticketSettingsObj.tipos, function(tipo){ 
     App.config.tickets.tipos.insert(tipo); 
    }); 

顯然我誤解的東西,但仍然不知道...

回答

2

您需要將回調傳遞給Meteor.call。服務器可以同步運行它,阻塞直到它返回,但客戶端不能這樣,ticketSettingsObj將始終未定義。

Meteor docs

沒有錯誤處理(和未經測試):

Meteor.call('getTicketSettings', function(error, result){ 
    console.log(result); 
    _.map(result.tipos, function(tipo){ 
    App.config.tickets.tipos.insert(tipo); 
}); 
}); 
+0

感謝您指出了這一點,我沒有閱讀不夠仔細:「在客戶端,如果你不及格一個回調,你不在一個存根內,調用將返回undefined,你將無法獲得方法的返回值,這是因爲客戶端沒有光纖,所以實際上沒有辦法阻止方法的遠程執行「。 – Rubs

1

做一個console.log(App.config.tickets),看看它是否會返回一個有效的對象。如果沒有,則只在服務器端定義對象App.config.tickets。如果這是故意的,並且只希望在服務器端可以訪問它,則請添加if(Meteor.isServer)或將其定義移動到/server目錄中的文件中。