如何使用Google Calendar API和NodeJS列出用户的可用日历

时间:2018-09-30 14:19:26

标签: node.js google-calendar-api

我刚刚完成了Google关于如何使用Calendar API的Quickstart Tutorial的讨论,一切正常。

现在,我尝试获取用户已预订的所有日历的列表,似乎calendarList.list方法确实满足我的需求。

我这样称呼它:

calendar.calendarList.list(
    {},
    (err, result) => console.log("Output: " + JSON.stringify(result))
);

文档页面仅列出了可选参数,因此我不传递任何参数,而是按照本教程中使用的callback-as-second-parameter-pattern进行操作。不幸的是,我找不到关于nodejs API的更好文档,所以我坚持这些模糊的假设。

我的完整代码如下:

const fs = require('fs');
const { google } = require('googleapis');

const SCOPES = ['https://www.googleapis.com/auth/calendar'];
const TOKEN_PATH = 'token.json';

fs.readFile('credentials.json', (err, content) => {
    if (err) return console.log('Error loading client secret file:', err);
    authorize(JSON.parse(content), start);
});

function authorize(credentials, callback) {
    const { client_secret, client_id, redirect_uris } = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(
        client_id, client_secret, redirect_uris[0]);

    fs.readFile(TOKEN_PATH, (err, token) => {
        if (err) return getAccessToken(oAuth2Client, callback);
        oAuth2Client.setCredentials(JSON.parse(token));
        callback(oAuth2Client);
    });
}

function getAccessToken(oAuth2Client, callback) {
    const authUrl = oAuth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES,
    });
    console.log('Authorize this app by visiting this url:', authUrl);
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    rl.question('Enter the code from that page here: ', (code) => {
        rl.close();
        oAuth2Client.getToken(code, (err, token) => {
            if (err) return console.error('Error retrieving access token', err);
            oAuth2Client.setCredentials(token);
            fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
                if (err) console.error(err);
                console.log('Token stored to', TOKEN_PATH);
            });
            callback(oAuth2Client);
        });
    });
}

function start(auth) {
    const calendar = google.calendar({ version: 'v3', auth: auth });
    calendar.calendarList.list(
        {},
        (err, result) => console.log("Output: " + JSON.stringify(result))
    );
}

此脚本返回以下输出:

Output: undefined

那么检索已订阅日历列表的正确方法是什么?我在做什么错了?

谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您的脚本基本上是正确的。但是,当result中的(err, result) => console.log("Output: " + JSON.stringify(result)undefined时,我认为可能会发生错误。那么,此确认和修改如何?

确认点:

  • “快速入门指南”中使用的范围不同于使用脚本的范围。
    • 通过这种方式,我认为新作用域可能不会反映到访问令牌中。因此,请删除一次token.json,然后运行脚本并再次授权。这样,将重新创建token.json,并且可以在新作用域中使用访问令牌。
  • 请再次确认是否在API控制台上启用了Calendar API。

修改点:

  • 在最新版本的googleapis中,为了从(err, result) => console.log("Output: " + JSON.stringify(result))中检索值,请使用result.data

修改后的脚本:

如何修改脚本?

从:
(err, result) => console.log("Output: " + JSON.stringify(result))
至:
(err, result) => {
  if (err) {
    console.log(err);
  } else {
    console.log("Output: " + result.data); // or JSON.stringify(result.data)
  }
}

如果这不能解决您的问题,很抱歉。