停止用户Gmail监听后Google Cloud Pub/Sub仍收通知的问题排查
问题分析与解决步骤
1. 确保stop操作完整执行
你的removeWatcherFromGmailInbox函数中,调用gmail.users.stop时未添加await,会导致函数在停止通知的请求还未完成时就提前返回,后续的令牌撤销操作可能干扰stop的执行流程,导致通知未真正停止。修改代码如下,确保异步请求完成:
async removeWatcherFromGmailInbox({ gmailInboxRefreshToken, }: { gmailInboxRefreshToken: string; }): Promise<boolean> { const auth = await this.loadAuth(gmailInboxRefreshToken); const gmail = google.gmail({ version: 'v1', auth, }); // 添加await保证stop请求执行完成 await gmail.users.stop({ userId: 'me', }); return true; }
2. 清理Pub/Sub队列中的残留消息
即使成功停止Gmail的推送,Pub/Sub订阅队列中可能已经存在该用户的未处理消息,这些消息会继续触发message事件。需要在消息处理逻辑中判断用户状态,若已解绑则直接确认消息并丢弃:
sub.on('message', (message) => { this.logger.log('Received message:', message.data.toString()); const data = JSON.parse(message.data.toString()); // 根据实际数据结构获取用户标识(比如绑定的用户ID) const targetUserId = data?.userId; // 检查用户是否已解绑 if (isUserUnbound(targetUserId)) { // 确认消息,将其从队列中移除 message.ack(); return; } // 正常处理消息逻辑 });
3. 验证令牌撤销的彻底性
确保撤销令牌的操作完全生效,避免该用户的refreshToken还能生成新的accessToken重新触发监听。可以在撤销后尝试用该refreshToken重新生成auth对象,若无法生成则说明撤销有效。
内容的提问来源于stack exchange,提问作者Surya Mahla
相关产品推荐
相关产品推荐

