我试图理解为什么在调用 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;
},
});
这是我的 /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 对象,但浏览器显示此错误:Uncaught TypeError: Cannot read property 'tipos' of undefined in my /lib/initialization.js 此处:
_.map(ticketSettingsObj.tipos, function(tipo){
App.config.tickets.tipos.insert(tipo);
});
显然我误解了一些东西,但仍然想知道......
最佳答案
您需要将回调传递给 Meteor.call。服务器可以同步运行它,阻塞直到获得返回,但客户端不能,因此ticketSettingsObj将始终是未定义的。
没有错误处理(且未经测试):
Meteor.call('getTicketSettings', function(error, result){
console.log(result);
_.map(result.tipos, function(tipo){
App.config.tickets.tipos.insert(tipo);
});
});
关于Meteor.call 和延迟补偿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30493899/