TypeError:无法读取未定义的属性“消息”-Twitter API

Posted

技术标签:

【中文标题】TypeError:无法读取未定义的属性“消息”-Twitter API【英文标题】:TypeError: Cannot read property 'message' of undefined - Twitter API 【发布时间】:2018-10-09 09:40:03 【问题描述】:

下面是运行 app.js 时的输出。当一切正常时,这开始完全随机发生。完全没有任何改变。

 TypeError: Cannot read property 'message' of undefined
        at /home/ec2-user/environment/rt-bot/app.js:78:48
        at Request._callback (/home/ec2-user/environment/node_modules/twitter/lib/twitter.js:220:14)
        at Request.self.callback (/home/ec2-user/environment/node_modules/request/request.js:186:22)
        at emitTwo (events.js:106:13)
        at Request.emit (events.js:191:7)
        at Request.<anonymous> (/home/ec2-user/environment/node_modules/request/request.js:1163:10)
        at emitOne (events.js:96:13)
        at Request.emit (events.js:188:7)
        at IncomingMessage.<anonymous> (/home/ec2-user/environment/node_modules/request/request.js:1085:12)
        at IncomingMessage.g (events.js:292:16)

我尝试从我的主分支创建新实例(自上次工作以来没有提交),甚至仍然收到此错误。有什么想法吗?

导致错误的代码,尽管此代码以前可以工作。

T.get('search/tweets', query, function(err, data, response) 
  // continue if no errors
  if(!err)
    // loop
    for(let i = 0; i < data.statuses.length; i++)
      // get latest tweet ID
      let id =  id: data.statuses[i].id_str 

      // try favorite
      T.post('favorites/create', id, function(err, response)

        // log failures
        if(err)
          console.log('Try Favorite - ', err[0].message);
        

        // log success
        else
          let username = response.user.screen_name;
          let tweetId = response.id_str;
          console.log('Favorited: ', `https://twitter.com/$username/status/$tweetId`)
        

      );

第一次出现的图片。如您所见,一切正常,然后这个错误突然出现,环境或代码库完全没有变化。

更新:

使用console.log('Try Favorite - ', err.message); 而不是console.log('Try Favorite - ', err[0].message); 记录错误时的输出

[[Apr 28 21:27:00.702]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.705]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.706]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.707]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.708]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.709]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.712]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.713]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.718]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests
[[Apr 28 21:27:00.793]] [LOG]   Try Favorite -  HTTP Error: 429 Too Many Requests

另请注意,转推功能使用相同的控制台日志记录方法。请参阅下面的代码,并且输出正常。

// try retweet
      T.post('statuses/retweet', id, function(err, response)

        // log failures
        if(err)
          console.log('Try Retweet - ', err[0].message);
        

【问题讨论】:

尝试在没有 [0] 的情况下记录错误 我目前正在检查速率限制,看看它们是否可能在当天的收藏夹中受到速率限制,尽管通常它的输出不同,它可以解释发生的随机性。 GET 收藏/列表速率限制为每个窗口 75(15 分钟),而 GET 搜索/推文为 180(用户)- 450(应用)每个窗口。快速运行所有请求的编号。 所以,如果我理解正确,我收到错误的原因是因为它请求代码 429 消息,而不是可能以不同方式传递的“你已经收藏了这条推文”消息?但是,运行这些数字,似乎用户不应该受到速率限制,并且速率限制应该在新窗口开始时释放,但这种情况已经发生了更长的时间。 【参考方案1】:

Twit 使用 request 向 Twitter API 发送 HTTP 请求,因此错误将是单个对象而不是数组,因此您的错误处理程序看起来像

if(err)
  console.log('Try Favorite - ', err.message);

【讨论】:

感谢您的回答,但请参阅底部的编辑,因为不幸的是这也不起作用。 现在您可以看到真正的错误...请求太多...您在 twitter api 中遇到了一些限制 使用err.message而不是err[0].message显然解决了代码中的问题,并向您展示了问题的原因,超出了请求速率限制developer.twitter.com/en/docs/basics/rate-limits 你可以试试github.com/jhurliman/node-rate-limiter来帮你避免达到极限 我已经在使用该速率限制器中的做法,但是非常好的建议!我不确定什么会受到限制。只有帖子收藏夹/创建受到限制,而所有其他功能似乎都运行良好。我很难找到真正的 POST 限制,除了 hints 每天 1000 个,但收藏夹/创建 POST 请求少于 12 个,并且所有其他 POST 请求都正常。有趣的是,控制台日志记录 err.message 在未获得 HTTP 状态 429 时拒绝工作。

以上是关于TypeError:无法读取未定义的属性“消息”-Twitter API的主要内容,如果未能解决你的问题,请参考以下文章

Discord.js 在尝试将游戏消息转换为不和谐消息时给我留下“TypeError:无法读取未定义的属性 'includes'”

TypeError:无法读取 MEAN 堆栈中未定义的属性“_id”

NodeJs,mongoDB:TypeError:无法读取未定义的属性“全名”

React js TypeError:无法读取未定义的属性“参数”

(节点:4044)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“缓存”

TypeError:无法读取未定义的属性“receiver_id”