即使在允许一夜之间传播之后,停止观看频道也无效,但它没有响应错误。我仍然收到一个日历更改的5个通知。有时6.有时3.它是零星的。我们还会在8秒后收到第二轮相同操作的通知。有时6秒。有时是第三组随机计数。也是零星的。通过网络浏览器创建的单个日历共收到10条唯一消息。
答案 0 :(得分:1)
您可以在特定日历资源上执行无限量的观看请求,Google将始终为同一日历返回相同的日历资源ID,但您在请求中生成的uuid将有所不同,因此,您将收到您已制作的每个观看请求的多个通知。阻止来自特定日历资源的所有通知的一种方法是收听通知,拔出" x-goog-channel-id"和" x-goog-resource-id"来自通知标题,并在Channels.stop请求中使用它们。
{
"id": string,
"resourceId": string
}
每次执行观看请求时,都应该保留响应中的数据,并检查uuid或资源ID是否已经存在,如果是,则不再对该资源ID执行观看请求(如果您不是#39;想要收到多个通知。)
e.g。
app.post("/calendar/listen", async function (req, res) {
var pushNotification = req.headers;
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end("Post recieved");
var userData = await dynamoDB.getSignInData(pushNotification["x-goog-channel-token"]).catch(function (err) {
console.log("Promise rejected: " + err);
});
if (!userData) {
console.log("User data not found in the database");
} else {
if (!userData.calendar) {
console.log("Calendar token not found in the user data object, can't perform Calendar API calls");
} else {
oauth2client.credentials = userData.calendar;
await calendarManager.stopWatching(oauth2client, pushNotification["x-goog-channel-id"], pushNotification["x-goog-resource-id"])
}
}
};
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 :(得分:0)
使用文档中提到的Channels.stop。在您的请求正文中提供以下数据:
{
"id": string,
"resourceId": string
}
{p> id
是您created your watch request时的频道ID。资源ID也是如此。
请阅读此SO thread和this github forum以获取更多参考资料。
答案 2 :(得分:0)
不是Google专家,但我最近在应用程序中实现了它, 我正在尝试为将来的读者回答您的一些问题:
这是零星的
是因为您已经创建了多个频道来观看赛事。
8秒后,我们还将收到第二轮针对同一操作的通知
Google没有透露有关发送推送通知的最大延迟时间。
建议:
创建: 创建新频道时,请始终将channel_id和channel_resource保存在数据库中。
删除: 要删除频道时,只需将stop API endpoint与保存在数据库中的频道数据一起使用
更新: 如您所知,通道确实会过期,因此您需要不时更新它们。为此,请在您的服务器中创建一个老太婆,该老太婆将停止所有先前的频道,并且它将创建一个新的。
评论:每当出现问题时,请阅读Google API日历发送的错误消息。在大多数情况下,它会告诉您哪里出了问题。