我正在尝试学习Meteor,首先编写一个简单的应用程序,其中服务器根据用户输入调用HTTP API,处理信息,然后将其返回给客户端以显示它。
我没有取得多大成功。我似乎无法将结果从服务器返回给客户端:
if (Meteor.isServer) {
Meteor.methods({
checkTransit: function(method, url, options) {
this.unblock();
return Meteor.http.call(method, url, function(error, result) {
if (error) {
console.log('SERVER ERRR');
console.log(error);
} else {
console.log('SERVER RESULT');
console.log(result);
}
});
}
})
}
if (Meteor.isClient) {
Template.body.events({
"submit .new-task": function(event) {
// Prevent default browser form submit
event.preventDefault();
var text = event.target.text.value;
var method = 'GET';
var url = 'http://sometransitapi.com';
var options = {
headers: {
'accept': 'application/XML',
'content-type': 'application/XML'
}
}
Meteor.call('checkTransit', method, url, options, function (error, result) {
if (error) {
console.log('CLIENT ERRR');
console.log(error);
} else {
console.log('CLIENT RESULT');
var parser;
parser = new DOMParser();
var xmlDoc
xmlDoc = parser.parseFromString(result, "text/xml");
console.log(xmlDoc);
}
})
}
})
}
我可以看到结果返回到isServer的结果变量,但我无法将结果传递给isClient中的xmlDoc变量。我究竟做错了什么?这是在Meteor中为我想做的事情构建事物的正确方法吗?
答案 0 :(得分:5)
Meteor.http.call
(您正在传递回调)。 Meteor.methods
对象中的函数希望返回一个值,因此您应该同步调用Meteor.http.call
。将服务器代码更改为以下应该可以解决问题。
if (Meteor.isServer) {
Meteor.methods({
checkTransit: function(method, url, options) {
this.unblock();
// This will throw an exception and return it as the error object
// in your Meteor.call if an error occurs, otherwise it will
// return an empty error object and the result object will be
// the return value from Meteor.http.call
return Meteor.http.call(method, url);
}
})
}