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 に「Seattle, WA」と「"location works" が表示されますが、プロファイル ページには何も表示されません。誰かが私に何ができるかを知っていれば、本当に感謝しています。ありがとう。

4

1 に答える 1

3

まず、サーバーからデータが返されたときに同期呼び出しを使用する必要があります。これは、サーバーが meteor メソッドが完了したと判断したときにコールバックがデータを返すためです。(コールバックは、後でデータがサーバーから返されたときに発生します。その時点で、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 ")
}

2 つ目は、セッション ハッシュを使用してテンプレートからデータを返す必要があることです。これは、応答を取得するのに時間がかかり、getLocation が (コールバックなしで) 即時の結果を期待するためです。現時点では、クライアント側の JavaScript は、サーバーのように同期 API 呼び出しを使用できません。

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

テンプレートによって作成されたイベントを使用して、流星の呼び出しを開始します。

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のようなパッケージをmeteorite経由で使用して、リクエストを OAuth する方が簡単かもしれません。

于 2013-05-14T08:33:04.337 に答える