首页 > 解决方案 > 错误:未设置访问、刷新令牌或 API 密钥

问题描述

我正在尝试在 Node 中制作一个应用程序来访问我的谷歌日历,所以我按照https://developers.google.com/calendar/quickstart/nodejs上的步骤操作,但我得到了Error: Error: No access, refresh token or API key is set..

是的,我已经创建了凭据。

是的,我已经下载了 json,重命名为 client_secret.json 并添加到应用程序文件夹中。

这是代码:

    const fs = require('fs'); 
    const readline = require('readline'); 
    const {google} = require('googleapis'); 
    const OAuth2Client = google.auth.OAuth2; 
    const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly']; 
    const TOKEN_PATH = './client_secret.json';
        
    try {   
        const content = fs.readFileSync('client_secret.json');   
        authorize(JSON.parse(content), listEvents); 
    } catch (err) {   
        return console.log('Error loading client secret file:', err); 
    }
        
    function authorize(credentials, callback) {   
        const {client_secret, client_id, redirect_uris} = credentials.installed;   
        let token = {};   
        const oAuth2Client = new OAuth2Client(client_id, client_secret, redirect_uris[0]);
        
          // Check if we have previously stored a token.   
        try {
            token = fs.readFileSync(TOKEN_PATH);   
        } catch (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 callback(err);
                oAuth2Client.setCredentials(token);
                // Store the token to disk for later program executions
                try {
                    fs.writeFileSync(TOKEN_PATH, JSON.stringify(token));
                    console.log('Token stored to', TOKEN_PATH);
                } catch (err) {
                    console.error(err);
                }
            callback(oAuth2Client);
            });   
        }); 
    }
        
    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, {data}) => {
                if (err) return console.log('The API returned an error: ' + err);
                const events = data.items;
                if (events.length) {
                    console.log('Upcoming 10 events:');
                    events.map((event, i) => {
                    const start = event.start.dateTime || event.start.date;
                    console.log(`${start} - ${event.summary}`);
                });
            } else {
              console.log('No upcoming events found.');
            }   
    }); 
}

有任何想法吗?

标签: google-calendar-api

解决方案


您能再次确认以下几点吗?

  • const TOKEN_PATH = './client_secret.json';和的文件const content = fs.readFileSync('client_secret.json');相同。
    • 请从 修改const TOKEN_PATH = './client_secret.json';const TOKEN_PATH = './credentials.json';,然后重新运行。
    • 这样,client_secret.json您下载的内容可能已被覆盖。所以也请确认这一点。
  • 上述修改后出现错误时,请确认googleapis的版本。因为据报道 googleapis 使用 v25.0.0 - v30.0.0。对某些 API 有一些错误。
    • 如果您认为错误是bug,请将googleapis的版本修改为v24.0.0。错误可能会被删除。

参考 :

如果这些要点对您的情况没有用,我很抱歉。


推荐阅读