服务器调用HTTP API后,将数据从服务器方法返回到客户端

时间:2015-09-08 18:56:08

标签: meteor

我正在尝试学习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中为我想做的事情构建事物的正确方法吗?

1 个答案:

答案 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);
    }
  })
}