如何通过NodeJS访问私人Google日历?

时间:2018-06-15 19:58:21

标签: javascript node.js google-calendar-api

我正在尝试使用NodeJS Google API软件包访问私有Google日历,但收到错误“错误:未找到”:

Error: Not Found
    at createError (/Users/devacc/myproject/node_modules/axios/lib/core/createError.js:16:15)
    at settle (/Users/devacc/myproject/node_modules/axios/lib/core/settle.js:18:12)
    at Unzip.handleStreamEnd (/Users/devacc/myproject/node_modules/axios/lib/adapters/http.js:201:11)
    at emitNone (events.js:111:20)
    at Unzip.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1056:12)
    at _combinedTickCallback (internal/process/next_tick.js:138:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)

通过Google Developer Console拥有“service to service”键的用户拥有私人日历的完全权限。在权限中角色的项目 - > viewer'和'project - >所有者'都已指定。如果还有其他角色要使用,那我就找不到了。

我使用的代码如下,'apiKey'参数是解析的JSON文件,从创建'service to service'帐户和'calendarId'作为日历ID。

function authorize (key) {
    return new Promise((resolve, reject) => {
        var jwtClient = new google.auth.JWT(
            key.client_email,
            null,
            key.private_key,
            ['https://www.googleapis.com/auth/calendar.readonly'],
            null
        );

        const calendar = google.calendar({
            version: 'v3',
            auth: jwtClient
        });

        jwtClient.authorize((err) => {
           if (err) {
               reject(err);
           } else {
               resolve(calendar);
           }
        });
    });
}

function listEvents(calendarId, apiKey, days = 2) {
    return authorize(apiKey)
        .then((calendar) => {
            return new Promise((resolve, reject) => {
                var minTime = moment();
                var maxTime = minTime.clone().add((days ? days : defaultDays), 'days');

                calendar.events.list({
                    calendarId: calendarId,
                    orderBy: 'startTime',
                    showDeleted: 'false',
                    singleEvents: 'true',
                    timeMin: minTime.toISOString(),
                    timeMax: maxTime.toISOString()
                }, (err, response) => {
                    if (err) {
                        reject(err);
                    } else {
                        const data = response.data;
                        resolve(data.items);
                    }
                });
            });
        });
}

我应该注意,将上述代码与公共日历一起使用可以正常工作。这只是导致我这个问题的私人日历。日历是与具有密钥的用户相同的GSuite组织的一部分。

1 个答案:

答案 0 :(得分:1)

原来我需要在日历上以用户身份添加服务帐户。这是形式之一:

<name>@<project>.iam.gserviceaccount.com