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