2013-05-14 81 views
1

我正在使用Meteor和Twitter API進行項目。我想從Twitter獲取用戶信息。我編寫了一個函數,例如僅從Twitter返回用戶的位置。我相信這是對流星提出請求的正確方法。它是:使用Twitter API的Meteor.http.get問題

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得到someones位置。但我想發佈那個函數在頁面上返回的內容。就我而言,我想在用戶的個人資料中張貼。這不起作用。但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上,但在配置文件頁面上沒有任何內容,如果有人知道我可以做什麼,那將會非常感激,謝謝

回答

3

首先,當數據從服務器返回時,您需要使用synchronous call當服務器已經認爲流星方法已經完成時,回調將返回數據。 (回調將在以後的時間被解僱,當數據從服務器返回,屆時流星客戶端將已經得到的響應)

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 ") 
} 

第二個是,你需要使用一個會話哈希從模板返回數據。這是因爲得到響應需要一段時間,並且getLocation期望得到即時結果(沒有回調)。目前客戶端JavaScript不能使用服務器上的同步API調用。

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

使用模板created event火流星電話:

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您的要求爲您服務。

+0

嘿,非常感謝你,工作! :) – moni 2013-05-18 02:53:58

+0

啊,但你知道爲什麼有時它有效,有時它說錯誤? – moni 2013-05-18 03:16:34

+0

這可能是twitter向1.1 api的遷移和舊api的折舊。查看更新後的帖子 – Akshat 2013-05-18 09:21:34