2015-08-17 45 views
4

我正在尝试使用NodeJS API从Google日历获取忙碌信息,如https://developers.google.com/google-apps/calendar/v3/reference/freebusy/query所列。问题是我得到的唯一错误响应是'无效请求'。当我使用Google的Try It工具运行它时,我能够得到回应。我知道我正在获得授权客户。我能做些什么来进一步解决这个问题?如何解决freebusy google日历nodejs api问题?

function getAvail(auth, dateTimeRange, calID) { 
    var deferred = Q.defer(); // get a new deferral 
    calendar.freebusy.query({ 
      auth: auth, 
      items: [{id: calID}], 
      timeMin: (dateTimeRange.start).toISOString(), 
      timeMax: (dateTimeRange.end).toISOString(), 
      }, function(err, response) { 
        console.log('Response from the Calendar service: ' + response); 
        if (err) { 
          console.log('There was an error contacting the Calendar service: ' + err); 
          deferred.reject(); // deferred reject here 
          return; 
        } 
        var events = response[calID]['busy']; 
        if (events.length == 0) { 
          console.log('No upcoming events found.'); 
        } else { 
          console.log('busy in here...'); 
        } 
        deferred.resolve(response); // deferred resolve here 
      }); 
    return deferred.promise; // return a promise 

}

回答

8

唷!我终于明白我做错了什么。这里是代码,与我犯了一个错误的评论。我希望有更好的方法来找出这个问题。

function getAvail(auth, dateTimeRange, calID) { 
    console.log('auth:'+JSON.stringify(auth)); 
    console.log('date Time Range :'+(dateTimeRange.start).toISOString()+' --->'+(dateTimeRange.end).toISOString()); 
    console.log('calendar id to check freebusy:'+calID); 
    var deferred = Q.defer(); // get a new deferral 
    calendar.freebusy.query({ 
      auth: auth, 
      headers: { "content-type" : "application/json" }, 
      resource:{items: [{"id" : calID}], //needed to include resource instead of sending the params directly. 

         timeMin: (dateTimeRange.start).toISOString(), 
         timeMax: (dateTimeRange.end).toISOString() 
        } 
    }, function(err, response) { 
        console.log('Response from the Calendar service: ' + JSON.stringify(response)); 
        if (err) { 
          console.log('There was an error contacting the Calendar service: ' + err); 
          deferred.reject(); // deferred reject here 
          return; 
        } 
        var events = response.calendars[calID].busy; 
        if (events.length == 0) { 
          console.log('No upcoming events found.'); 
        } else { 
          console.log('busy in here...'); 
        } 
        deferred.resolve(response); // deferred resolve here 
      }); 
    return deferred.promise; // return a promise 
} 

这是很多冥想和密切注视文件。 Google的nodejs库在示例中没有特别详细记录(当然,它仍然是alpha)。但这里是freebusy功能: this.freebusy = {

/** 
* calendar.freebusy.query 
* 
* @desc Returns free/busy information for a set of calendars. 
* 
* @alias calendar.freebusy.query 
* @memberOf! calendar(v3) 
* 
* @param {object} params - Parameters for request 
* @param {object} params.resource - Request body data** <<<< -- this is what I was missing. 
* @param {callback} callback - The callback that handles the response. 
* @return {object} Request object 
*/ 
query: function(params, callback) { 
    var parameters = { 
    options: { 
     url: 'https://www.googleapis.com/calendar/v3/freeBusy', 
     method: 'POST' 
    }, 
    params: params, 
    requiredParams: [], 
    pathParams: [], 
    context: self 
    }; 

    return createAPIRequest(parameters, callback); 
} 

}; 

大约有内循环,我从这里学到SO创建关闭一些额外获悉:JavaScript closure inside loops – simple practical example。让我知道是否有人遇到类似的问题。我会很乐意分享我的代码示例。

+0

我一直在努力通过这个自己。感谢帖子,这帮助我解决问题! – Jeffpowrs