无法从Twitter检索数据(AJAX)

时间:2014-07-10 00:41:01

标签: javascript jquery ajax twitter

我正在尝试创建一个网页,当用户搜索某个主题时,会显示某个城市中与该主题相关的推文。请求成功转到Twitter - 响应为200,我可以在chrome开发人员工具中看到响应数据。但是,我无法将数据发布到我的页面上,甚至无法登录控制台。我想知道我是否错误地调用了它?我特意看这个功能:

// Function that appends search result to DOM
var formatTweet = function(tweets) {

  //console.log(tweets);

  // clone template
  var result = $('.topic-template .topic-results').clone();

  // console.log(result); // ?? not logging result

  var image = result.find('.profile-img');
  image.attr('src', tweets.profile_image_url);

  var status = result.find('.status');
  status.append(tweets.text);

  var screenName = result.find('.screen-name');
  screenName.append(tweets.statuses.user.screen_name);

  var location = result.find('location');
  location.append(tweets.user.location);

  var time = result.find('.time');
  time.append(tweets.created_at); 

  return result; 
}; // end showUser function

也许我不正确地引用推文对象?我收到的错误是: Uncaught TypeError: Cannot read property 'screen_name' of undefined.

还有一个错误:

Error in event handler for (unknown): Cannot read property 'innerHTML' of null
Stack trace: TypeError: Cannot read property 'innerHTML' of null
    at Object.AMZUWLXT.tests.popNodeData (chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/tests.js:79:33)
    at Object.<anonymous> (chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/tests.js:168:28)
    at Object.<anonymous> (chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/tests.js:12:28)
    at Object.<anonymous> (chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/tests.js:12:28)
    at chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/tests.js:12:28
    at Object.runPage (chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/isProduct.js:159:12)
    at chrome-extension://ciagpekplgpbepdgggflgmahnjgiaced/contentScripts/runIsProduct.js:15:22
    at messageListener (extensions::messaging:340:9)
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14)
    at EventImpl.dispatchToListener (extensions::event_bindings:395:22)

我不知道这意味着什么。

我不确定如何调试。

以下是链接:http://amykirst.github.io/twitter-api/

1 个答案:

答案 0 :(得分:0)

根据您所做的GET请求,您将所有相关状态作为推文对象作为响应。

以下是您第一次打电话给Twitter后的内容。

Statuses

    0 Object { metadata={...}, created_at="Thu Jul 10 02:08:11 +0000 2014", id=487055653404672000, more...}
    1 Object { metadata={...}, created_at="Wed Jul 09 22:32:23 +0000 2014", id=487001346227175400, more...}
    2 Object { metadata={...}, created_at="Wed Jul 09 22:06:00 +0000 2014", id=486994705406648300, more...}     
    3 Object { metadata={...}, created_at="Wed Jul 09 21:58:41 +0000 2014", id=486992863012454400, more...}
    ...
    ...

完成所有操作后,您应该迭代每个,然后格式化它们。

换句话说,在你的函数中,你应该只格式化一个对象,一个推文。

如果检查响应的属性,您会看到,例如,第一个对象具有如下属性:

0   
  contributors  null
  coordinates   null
  created_at    "Thu Jul 10 02:08:11 +0000 2014"
  entities      Object { hashtags=[0], symbols=[0], urls=[1], more...}
  favorite_count 0
  favorited     false
  ....
  ....
  text          "Game of Thrones Season I... http://t.co/y5gf52xXg5"
  user           Object { id=49376425, id_str="49376425", name="Mark Yesilevskiy", more...}

您可以看到用户属性是其中的对象。因此,例如,如果您想要访问第一个对象的用户名属性,那么您可以像从Statuses[0].user.name那样从root访问它

因此,如果我们遇到您的问题,在对象中,您无法访问与您类似的screen_name参数,这就是您收到该错误的原因。

要修复它,首先在成功获取所有推文之后,迭代每个推文然后格式化它们。

$.each(tweets.statuses, function(i, tweet) {
     formatTweet(tweet).appendTo('#topic-results');
});​

在您的formatTweet函数中,您需要更改此内容,如上所述:

screenName.append(tweets.statuses.user.screen_name);

要:

screenName.append(tweets.user.screen_name);

此外,您实际上是在那里访问一条推文,因此逻辑上它应该是tweet而不是tweets,但它不是一个问题,因为它只是一个参数。

这也是错误的:

var location = result.find('location');

更改为:

var location = result.find('.location');

另外,将此div添加到您的html中,其中将附加推文:

<div id="topic-results"></div>

您可以查看以下快速小提琴http://jsfiddle.net/zeZ38/