Meteor.call和延迟补偿

Meteor.call和延迟补偿,meteor,Meteor,我试图理解为什么调用meteor服务器方法时会出现错误。它在服务器端工作,但在浏览器中抛出错误 这是我在/server/methods.js文件中的服务器代码: Meteor.methods({ getTicketSettings: function(){ var getTicketConfig = function(callback){ Assets.getText('ticketCustomizing.json', function(error

我试图理解为什么调用meteor服务器方法时会出现错误。它在服务器端工作,但在浏览器中抛出错误

这是我在/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;
    },
});
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);
     });
});
这是我在/lib/initialization.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;
    },
});
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对象记录在控制台中,但浏览器显示以下错误:Uncaught TypeError:无法读取my/lib/initialization.js中未定义的属性“tipos”:

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

显然,我误解了某些内容,但仍然想知道……

执行
console.log(App.config.tickets)
并查看它是否返回有效的对象。如果没有,那么您只在服务器端定义了对象
App.config.tickets
。如果这是有意的,并且您只想在服务器端访问它,那么请添加一个
If(Meteor.isServer)
或将定义移动到
/server
目录中的文件中

您需要将回调传递给Meteor.call。服务器可以同步运行它,阻塞直到它得到返回,但是客户端不能,因此ticketSettingsObj将始终是未定义的

无错误处理(且未经测试):


谢谢你指出这一点,我读得不够仔细:在客户机上,如果您不传递回调,并且您不在存根中,则调用将返回未定义的,并且您将无法获取方法的返回值。这是因为客户端没有光纤,因此实际上没有任何方法可以阻止方法的远程执行。”