首页 > 解决方案 > 如何使用 Google Calendar API 和 NodeJS 列出用户的可用日历

问题描述

我刚刚完成了 Google 的关于如何使用 Calendar API 的快速入门教程,并且一切正常。

现在我尝试获取用户订阅的所有日历的列表,并且该calendarList.list方法似乎完全符合我的需要。

我这样称呼它:

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

文档页面仅列出了可选参数,因此我不传递任何参数,并遵循教程中使用的回调作为第二参数模式。不幸的是,我找不到更好的 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

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

提前致谢。

标签: node.jsgoogle-calendar-api

解决方案


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

确认要点:

  • 快速入门教程中使用的范围与使用您的脚本的范围不同。
    • 这样,我认为新范围可能不会反映到访问令牌中。所以请删除token.json一次,然后运行脚本并再次授权。这样,token.json将重新创建,您可以将访问令牌与新范围一起使用。
  • 请再次确认是否在 API 控制台启用了日历 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)
  }
}

如果这不是您问题的解决方案,我很抱歉。


推荐阅读