使用Twitter lib获取错误

时间:2016-01-08 02:35:52

标签: javascript twitter google-apps-script

在Google Apps脚本中,我在项目中有这段代码发送推文(also in jsBin):

function sendTweet(status) {

  var twitterKeys= {
    TWITTER_CONSUMER_KEY: "x",
    TWITTER_CONSUMER_SECRET: "x",
    TWITTER_ACCESS_TOKEN: "x",
    TWITTER_ACCESS_SECRET: "x"    
  };

  var props = PropertiesService.getScriptProperties();

  props.setProperties(twitterKeys);
  twit = new Twitter.OAuth(props);

  var service = new Twitter.OAuth(props);


  if ( service.hasAccess() ) {

    var response = twit.sendTweet(status);

    if (response) {

      Logger.log("Tweet ID " + response.id_str);

    } else {

      // Tweet could not be sent
      // Go to View -> Logs to see the error message

    }
  }  
}

sendTweet("test");

但我遇到的问题是我收到了这个错误:

TypeError: Cannot read property "text" from undefined. (line 293, file "twitter", project "Twitter lib")

第293行来自"Twitter lib" libraryMKvHYYdYA4G5JJHj7hxIcoh8V4oX7X1M_)的第21版。

消息" test"尽管有这个错误,实际上也会收到推文。有谁知道如何解决它?

2 个答案:

答案 0 :(得分:2)

嗨,Twitter Lib的作者。 @Mogsdad在Twitter上指出了我。我想我知道你的剧本发生了什么,这是Google Script工作原理的一个特点。

您的大部分代码都在一个带参数的函数中,然后您可以在脚本的顶层调用该函数。当您进入“运行”菜单并选择sendTweet功能时,顶级脚本在执行所选功能之前运行会发生什么,并且推文会当时用“测试”文本发送。

然后,sendTweet运行时没有参数,这意味着status变量为undefined。您正在向twit.sendTweet()发送未定义的值,导致您看到的错误。

我在这里推荐的只是将最后一行代码包装到一个函数中,以便您可以从“运行”菜单中调用它,如下所示:

function sendTestTweet() {
    sendTweet("test");
}

答案 1 :(得分:1)

回顾一下,您看到的错误是:

  

TypeError:无法从undefined中读取属性“text”。 (第293行,文件“twitter”,项目“Twitter lib”)

这是the librarysendTweet()方法,见下文。

/**
* Upload a tweet to Twitter with optional media.
*
* @param {string | Tweet} tweet the status text to send as a Twitter update
* @param {optional object} params any additional parameters to send as part of the update post
* @return {object} the Twitter response as an object if successful, null otherwise
*/
OAuth.prototype.sendTweet = function(tweet, params) {
  var i;
  var payload = {       //<=== 293
    "status" : (tweet.text || tweet)
  };

您的代码使用单个字符串参数status调用此方法,该参数设置为“test”。

库的作者允许tweet参数成为以下两种情况之一:

  • 它可以是包含Tweet消息的text属性的对象,或
  • 它可以是一个字符串。

但是,正在处理的方式首先检查tweet.text,如果不存在则检查字符串tweet。当tweet.text不存在时(即仅使用字符串时),将抛出该TypeError。

我已经联系了图书馆作者,因此他们可以发布修复程序。但是,在此期间,您可以发送带有Tweet属性的text对象,或者获取该库的副本并自行更新。

  • 发送Tweet对象。 Tweet对象记录在Twitter API v1.1 documentation中,但由于此操作中涉及的唯一属性是text,因此只需更改你的status函数可以解决问题。只需确保status是具有text属性的对象。

    function sendTweet(status) {
      if (typeof status === string)
        status = {text:status};
      ...
    
  • 自行更新库。 为避免错误,并正确处理参数选项,库中的第294行应为:

    "status" : (tweet.hasOwnProperty("text") ? tweet.text : tweet)
    

    或者:

    "status" : (typeof tweet === 'object' ? tweet.text : tweet)
    

    您需要发布它,并更新代码中的库ID,但这应该解决这个问题。库更新可用后,您可以切换回来。