Error: No access, refresh token or API key is set

Error: No access, refresh token or API key is set

我正在尝试在 Node 中制作一个应用程序来访问我的 google 日历,所以我按照 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.');
            }   
    }); 
}

有什么想法吗?

能否再次确认以下几点?

  • 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。错误可能会被删除。

参考资料:

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