You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我这样操作时Google Calendar API Node.js示例无法运行?

解决Google Calendar API Node.js示例运行异常问题

我看到你在调整Google Calendar API的Node.js快速入门示例时遇到了运行问题,这里给你补全并整理好可正常运行的完整代码,同时附上关键排查点帮你定位问题:

完整可运行代码

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

// 初始化OAuth2客户端
const OAuth2Client = google.auth.OAuth2;
// 只读权限Scope,如需修改日历可替换为对应权限
const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'];
// 存储用户令牌的本地路径
const TOKEN_PATH = 'token.json';

// 从本地加载客户端密钥文件
fs.readFile('client_secret.json', (err, content) => {
  if (err) return console.log('加载客户端密钥文件出错:', err);
  // 授权后调用Calendar API
  authorize(JSON.parse(content), listEvents);
});

/**
 * 创建OAuth2客户端,检查本地令牌,无令牌则发起授权流程
 * @param {Object} credentials 客户端密钥信息
 * @param {function} callback 授权完成后的回调函数
 */
function authorize(credentials, callback) {
  const { client_secret, client_id, redirect_uris } = credentials.installed;
  const oAuth2Client = new OAuth2Client(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);
  });
}

/**
 * 发起授权流程,获取并存储用户令牌到本地
 * @param {OAuth2Client} oAuth2Client OAuth2客户端实例
 * @param {function} callback 授权完成后的回调函数
 */
function getAccessToken(oAuth2Client, callback) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('请访问此URL完成授权:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('请输入授权页面返回的授权代码: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('获取访问令牌出错:', err);
      oAuth2Client.setCredentials(token);
      // 存储令牌到本地,避免重复授权
      mkdirp.sync('./');
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error('存储令牌文件出错:', err);
        console.log('令牌已存储到:', TOKEN_PATH);
      });
      callback(oAuth2Client);
    });
  });
}

/**
 * 调用Calendar API,列出用户最近10个日历事件
 * @param {OAuth2Client} auth 已授权的OAuth2客户端实例
 */
function listEvents(auth) {
  const calendar = google.calendar({ version: 'v3', auth });
  calendar.events.list({
    calendarId: 'primary',
    timeMin: new Date().toISOString(),
    maxResults: 10,
    singleEvents: true,
    orderBy: 'startTime',
  }, (err, res) => {
    if (err) return console.log('调用Calendar API出错:', err);
    const events = res.data.items;
    if (events.length) {
      console.log('最近的10个日历事件:');
      events.map((event, i) => {
        const start = event.start.dateTime || event.start.date;
        console.log(`${start} - ${event.summary}`);
      });
    } else {
      console.log('未找到任何日历事件。');
    }
  });
}

关键排查点(若代码仍无法运行)

  • 依赖安装:确保已安装所有必需依赖,执行命令:
    npm install mkdirp googleapis
    
    (fs和readline是Node.js内置模块,无需额外安装)
  • 凭证文件:client_secret.json必须是从Google Cloud控制台下载的有效文件,放在项目根目录,注意文件名不要拼写错误
  • 目录权限:首次运行会生成token.json,确保项目目录有写入权限
  • 权限Scope:如果需要修改日历内容,需将SCOPES替换为['https://www.googleapis.com/auth/calendar'],并删除旧的token.json重新授权

内容的提问来源于stack exchange,提问作者rahulserver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:42:21