Google calendar api 谷歌日历API监视频道未停止

Google calendar api 谷歌日历API监视频道未停止,google-calendar-api,Google Calendar Api,停止一个监视频道不起作用,尽管它没有响应错误,即使在允许一夜之间传播之后也是如此。我仍然收到5个日历列表更改通知。有时6个,有时3个。这是零星的。8秒后,我们还会收到第二轮相同操作的通知。有时是6秒。有时是第三轮,随机计数。也是零星的。通过web浏览器创建的单个日历共收到10条独特的消息。使用文档中提到的。在请求正文中提供以下数据: { "id": string, "resourceId": string } id是您选择时的频道id。资源ID也是如此 阅读此内容并获取更多参考。您可以

停止一个监视频道不起作用,尽管它没有响应错误,即使在允许一夜之间传播之后也是如此。我仍然收到5个日历列表更改通知。有时6个,有时3个。这是零星的。8秒后,我们还会收到第二轮相同操作的通知。有时是6秒。有时是第三轮,随机计数。也是零星的。通过web浏览器创建的单个日历共收到10条独特的消息。

使用文档中提到的。在请求正文中提供以下数据:

{
  "id": string,
  "resourceId": string
}
id
是您选择时的频道id。资源ID也是如此


阅读此内容并获取更多参考。

您可以对特定日历资源执行无限量的监视请求,Google将始终为同一日历返回相同的日历资源Id,但您在请求中生成的uuid将不同,因此,对于您发出的每个监视请求,您将收到多个通知。停止来自特定日历资源的所有通知的一种方法是侦听通知,从通知头中拉出“x-goog-channel-id”和“x-goog-resource-id”,并在Channels.stop请求中使用它们

{
  "id": string,
  "resourceId": string
}
每次执行监视请求时,都应保留响应中的数据,并检查uuid或资源id是否已存在,如果存在,则不要再次对该资源id执行监视请求(如果不希望接收多个通知)

e、 g

calendarManager.js

module.exports.stopWatching = function (oauth2client, channelId, resourceId) {
    return new Promise(function (resolve, reject) {
        calendar.channels.stop({
            auth: oauth2client,
            resource: {
                id: channelId,
                resourceId: resourceId
            }
        }, async function (err, response) {
            if (err) {
                console.log('The API returned an error: ' + err);
                return reject(err);
            } else {
                console.log("Stopped watching channel " + channelId);
                await dynamoDB.deleteWatchData(channelId)
                resolve(response);
            }
        })
    })
}

不是谷歌专家,但我最近在我的应用程序中实现了它, 我试图回答你的一些问题,供未来读者参考:


这是零星的

这是因为你已经创建了超过1个观看活动的频道

我们还将在8秒后收到第二轮相同操作的通知

谷歌没有透露发送推送通知的最大延迟

建议:

创建: 创建新频道时,请始终将频道id和频道资源保存在数据库中

删除: 如果要删除频道,只需使用数据库中保存的频道数据即可

续订: 正如您所注意到的,这些频道确实会过期,因此您需要时不时地更新它们。为此,在服务器中创建一个crone,它将停止所有以前的通道,并创建一个新通道


评论:每当出现问题时,请阅读从Google API日历发送的错误消息。大多数情况下,它会告诉您出了什么问题。

我们已尝试使用RESTful API执行此操作,但无法成功停止通道。创建通道后是否有一定的等待时间才能停止通道?
module.exports.stopWatching = function (oauth2client, channelId, resourceId) {
    return new Promise(function (resolve, reject) {
        calendar.channels.stop({
            auth: oauth2client,
            resource: {
                id: channelId,
                resourceId: resourceId
            }
        }, async function (err, response) {
            if (err) {
                console.log('The API returned an error: ' + err);
                return reject(err);
            } else {
                console.log("Stopped watching channel " + channelId);
                await dynamoDB.deleteWatchData(channelId)
                resolve(response);
            }
        })
    })
}