【发布时间】:2017-12-01 22:52:43
【问题描述】:
我从这里获取代码:https://developers.google.com/google-apps/calendar/quickstart/nodejs 并让它在本地工作并返回日历事件的 JSON 对象。
我把它变成了一个名为 GoogleCalendarAPI.js 的模块,并且仍然让它在本地工作。
我尝试了这个 StackOverflow 答案中的方法:How to oAuth Google API from Lambda AWS?。无论我是否使用令牌,我都会得到相同的结果,按照那里的描述进行检索;或者我是否使用 client_secret.json 文件。
exports.getCalendarJSONEvents =
function getCalendarJSONEvents(callback) {
console.log("started getCalendarJSONEvents");
listEvents(TOKEN, function(jsonResult) {
console.log("Json Callback Events=");
console.log(jsonResult);
callback(jsonResult);
});
}
function listEvents(auth, callback) {... etc...
调用 Lambda 的 index.js 会这样做:
console.log("log: WhenIntent");
var GoogleCalendarAPI = require('./GoogleCalendarAPI.js');
GoogleCalendarAPI.getCalendarJSONEvents(
function callback(calEvents){
console.log("WRAPPER: calendarResults=" +
JSON.stringify(calEvents));
// chunk misc code here
this.emit(':tell', speechText);
});
我在日志中看到的最后一件事是“日志:WhenIntent”。这是一个 Alexa 应用程序,我正在使用我的用户帐户访问一个公共日历。我不知道之后它在做什么,也不知道如何进一步调试它。我不确定为什么在超时之前我没有看到“started getCalendarJSONEvents”(默认 3 秒,也尝试了 5 秒)。
更新 1:
好的,CloudWatch 日志确实显示“API 返回错误:错误:错误请求”,我认为这是 Lambda 错误,但它来自 listEvents。我添加了下面提到的行,至少现在逻辑回流了,稍后我将解释“错误请求”的原因。
function listEvents(auth, callback) {
console.log("log: start listEvents");
var calendar = google.calendar('v3');
console.log("log: listEvents got calendar var");
var jsonOut = "{";
calendar.events.list({
auth: auth,
calendarId: 'somename@group.calendar.google.com',
timeMin: (new Date()).toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime'
}, function(err, response) {
if (err) {
// made this error more clear!
console.log('The Google Calendar API returned an error: ' + err);
callback(err); // added this line
return;
}
var events = response.items;
if (events.length == 0) {
console.log('No upcoming events found.');
} else {
console.log('Upcoming 10 events:');
var jsonLine = "";
for (var i = 0; i < events.length; i++) {
var event = events[i];
var start = event.start.dateTime || event.start.date;
console.log('%s - %s', start, event.summary);
jsonLine =
[{ 'date': event.start.date,
'summary': event.summary
}];
console.log("jsonline=")
jsonOut = jsonOut + JSON.stringify(jsonLine) + ",";
}
jsonOut = jsonOut + "}";
}
console.log("End of listEvents: jsonOut = " +
JSON.stringify(jsonOut));
callback(jsonOut);
});
【问题讨论】:
-
您是否收到类似“在封闭管道上读/写”之类的错误?
-
require('./GoogleCalendarAPI.js')可能找不到文件并抛出异常。你可以在需要后添加console.log并尝试吗?您可以在此处添加 AWS Lambda 的日志输出吗? -
谢谢,看看我的更新,我想我明白了。当我使用 TOKEN 时,我收到了错误的请求。我必须切换回“client_secret.json”来看看那个会发生什么。
-
超时现在似乎消失了,即使是另一种方式;仍然无法读取日历,但这是 OAUTH 问题。
-
@nilobarp 与这个问题无关,但是是什么导致了关闭管道错误的读/写?我从似乎正确返回的函数中遇到了这个问题(至少 sam local 显示了 requestID 的报告)
标签: node.js aws-lambda google-calendar-api