为何我这样操作时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 googleapisfs和readline是Node.js内置模块,无需额外安装) - 凭证文件:
client_secret.json必须是从Google Cloud控制台下载的有效文件,放在项目根目录,注意文件名不要拼写错误 - 目录权限:首次运行会生成
token.json,确保项目目录有写入权限 - 权限Scope:如果需要修改日历内容,需将
SCOPES替换为['https://www.googleapis.com/auth/calendar'],并删除旧的token.json重新授权
内容的提问来源于stack exchange,提问作者rahulserver
相关产品推荐
相关产品推荐

