google calenderID nodejs 不适用于指定的 CalendarID

Posted

技术标签:

【中文标题】google calenderID nodejs 不适用于指定的 CalendarID【英文标题】:google calenderID nodejs doesn't work with specified CalendarID 【发布时间】:2021-11-01 00:58:11 【问题描述】:

我想使用谷歌日历,如果我选择日历 ID 不是主要的,而是使用指定的,我会在 line 46 (const eventsArray = res.data.calendars.calID.busy) 中收到一条错误消息。错误消息类似于(node:49993) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'calendar' of undefined。所以基本上,我相信,它无法读取日历 ID,有谁能帮我找出我的错吗?

const  google  = require('googleapis');
    const  OAuth2  = google.auth;
    const oAuth2Client = new OAuth2(
        'id_works_with_primary_calender', 
        'key_works_with_primary_calender'
    )
    
    oAuth2Client.setCredentials(
        refresh_token: 
            'works_with_primary',
    )
    
    const calendar = google.calendar(  version: 'v3', auth: oAuth2Client  );
    
    const eventStartTime = new Date()
    eventStartTime.setDate(eventStartTime.getDay() + 2)
    
    const eventEndTime = new Date()
    eventEndTime.setDate(eventEndTime.getDay() + 2)
    eventEndTime.setMinutes(eventEndTime.getMinutes() + 45)
    
    const event = 
        summary: 'Meet with David',
        location: '295 California St, San Francisco, CA 94111',
        description: 'Meeting with David to talk about the new client Project and drink some stuff',
        colorId: 1,
        start: 
            dateTime: eventStartTime,
            timeZone: 'Europe/Zurich',
        ,
        end: 
            dateTime: eventEndTime,
            timeZone: 'Europe/Zurich',
        ,
    
    
    calendar.freebusy.query( 
        resource: 
            timeMin: eventStartTime,
            timeMax: eventEndTime,
            timeZone: 'Europe/Zurich',
        items: [  id: 'gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com'  ],
        ,
    , (err, res) => 
        if (err) return console.error('Free Busy Query Error: ', err)
        //Here is the error    
        const eventsArray = res.data.calendars.gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com.busy
        if(eventsArray.length === 0)
            return calendar.events.insert(  
                calendarId: 'gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com',
                resource: event,
            ,
            err => 
                if (err) return console.error('Calender Event Creation: ' + err)
                    return console.log('Event Created: ' + event)    
        )
        return console.log("I'm Busy")
    )

【问题讨论】:

【参考方案1】:

问题:

问题似乎是id 包含几个点,程序认为这些用于访问嵌套属性。因此,它正在寻找 id gd3q30fhkprf0ubsk3pnqkc64k@group 的属性 calendar,当然,它没有找到它,因为正确的 id 是 gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com

解决办法:

因此,假设idres.data.calendars 返回,则应通过将访问key 属性的语法从点表示法更改为方括号表示法来解决问题。

也就是说,替换这个:

const eventsArray = res.data.calendars.gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com.busy

有了这个:

const eventsArray = res.data.calendars["gd3q30fhkprf0ubsk3pnqkc64k@group.calendar.google.com"].busy

参考:

Property accessors

【讨论】:

以上是关于google calenderID nodejs 不适用于指定的 CalendarID的主要内容,如果未能解决你的问题,请参考以下文章

使用 NodeJS 对 Google 推送通知的操作

NodeJS 中的 Google App Engine 日志记录

如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求

NodeJS:从用户 Google Drive 下载文件

如何通过Google Cloud调试在Docker容器内运行的Nodejs应用程序

在 NodeJS 项目中放置 Google Maps API 密钥的位置