1

我正在为一个项目使用 Meteor 和 Twitter API。我想从 Twitter 获取有关用户的信息。例如,我编写了一个函数,它只返回来自 Twitter 的用户的位置。我相信这是对 Meteor 提出请求的正确方法。这里是 :

Meteor.methods({getTwitterLocation: function (username) { 

  Meteor.http.get("https://api.twitter.com/1/users/show.json?screen_name="+ username +"&include_entities=true", function(error, result) {
    if (result.statusCode === 200) {
      var respJson = JSON.parse(result.content);
      console.log(respJson.location);
      console.log("location works");
      return (respJson.location)
    }else {
      return ( "Unknown user ")
    }
  });

}});

现在这个函数将在我的 Git Bash 上记录控制台中的内容。我通过 Meteor.call 获得某人的位置。但我想在页面上发布该函数返回的内容。就我而言,我想在用户的个人资料上发帖。这行不通。但是 console.log(respJson.location) 返回我的 Git Bash 中的位置,但它不会在个人资料页面上显示任何内容。这是我在个人资料页面上所做的:

profile.js:

Template.profile.getLocation= function(){
 return Meteor.call("getTwitterLocation","BillGates");
}

profile.html:

<template name="profile">
 from {{getLocation}}
</template>

有了这个,我在我的 Git Bash 上得到“西雅图,华盛顿”和“位置有效”,但在个人资料页面上什么也没有。如果有人知道我能做什么,那将非常感激。谢谢。

4

1 回答 1

3

首先,当服务器返回数据时,您需要使用同步调用,因为当服务器已经认为meteor方法完成时,回调将返回数据。(回调将在稍后被触发,当数据从服务器返回时,流星客户端已经得到响应)

var result =  Meteor.http.get("https://api.twitter.com/1/users/show.json?screen_name="+ username +"&include_entities=true");

if (result.statusCode === 200) {
  var respJson = JSON.parse(result.content);
  console.log(respJson.location);
  console.log("location works");
  return (respJson.location)
}else {
  return ( "Unknown user ")
}

第二个是您需要使用 Session 哈希从模板返回数据。这是因为获取响应需要时间,并且 getLocation 会期望即时结果(没有回调)。目前,客户端 javascript 不能像在服务器上那样使用同步 api 调用。

Template.profile.getLocation= function(){
    return Session.get("twitterlocation");
}

使用模板created 事件来触发流星调用:

Template.profile.created = function() {
    Meteor.call("getTwitterLocation","BillGates", function(err,result) {
        if(result && !err) {
            Session.set("twitterlocation", result);
        }
        else
        {
            Session.set("twitterlocation", "Error");
        }
    }); 
});

更新:

Twitter 已将其 API 更新为 1.1,需要进行一些修改:

您现在需要使用 1.1 而不是 1 来切换到 1.1 api。此外,您需要对您的请求进行 OAuth。请参阅https://dev.twitter.com/docs/auth/authorizing-request。下面包含示例数据,但您需要获取正确的密钥

var authkey = "OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", 
          oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", 
          oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", 
          oauth_signature_method="HMAC-SHA1", 
          oauth_timestamp=""+(new Date().getTime()/1000).toFixed(0)+"", 
          oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", 
          oauth_version="1.0"";

请务必删除换行符,我已将其包装以使其易于阅读。

var result =  Meteor.http.get("https://api.twitter.com/1.1/users/show.json?screen_name="+ username +"&include_entities=true",{headers:{Authorization : authkey});

如果你觉得这有点麻烦,那么通过陨石使用像https://github.com/Sewdn/meteor-twitter-api这样的包来 OAuth 对你的请求可能会更容易。

于 2013-05-14T08:33:04.337 回答