我很困惑,gmail API中的watch功能应该如何实现,以便在 node 内接收push notificatons.js脚本.我应该在无限循环中调用该方法吗,这样它在调用后就不会停止监听邮箱通知了吗?

下面是我在node中编写的示例代码.js:

const getEmailNotification = () => {
return new Promise(async (resolve, reject) => {
    try{
        let auth = await authenticate();
        const gmail = google.gmail({version: 'v1', auth});
        await gmail.users.stop({
            userId: '<email id>'
        });
        let watchResponse = await gmail.users.watch({
            userId: '<email id>', 
            labelIds: ['INBOX'],
            topicName: 'projects/<projectName>/topics/<topicName>'
        })
        return resolve(watchResponse);
    } catch(err){
        return reject(`Some error occurred`);
    }
})

非常感谢.

推荐答案

Summary

要通过PUB/SUB接收推送通知,您需要创建一个web钩子来接收它们.这是什么意思?您需要一个WEB应用程序或任何类型的服务来公开可以接收通知的URL.

如Push subscription documentation中所述:

  1. 发布/订阅服务器将每条消息作为HTTPS请求发送到预配置端点处的订户应用程序.

  2. 端点通过返回HTTP成功状态代码来确认消息.未成功响应表示应重新发送消息.

设置观看频道通知可总结为以下步骤(您所指的the documentation表示通知):

  1. Select/Create年内完成一个项目.
  2. 创建一个new PUB/SUB topic
  3. 为该主题创建一个subscription (PUSH).
  4. 添加necessary permissions,在本例中,将gmail-api-push@system.gserviceaccount.com添加为Pub/Sub Publisher.
  5. 通过Users.watch()方法(这就是你在脚本中所做的)指出你希望它监听的邮件类型.

Example

我给你举了一个使用Apps脚本的例子(这是一个可视化它的简单方法,但这可以通过任何类型的WEB应用程序实现,因为你使用的是Node.js,我想你熟悉Express.js或相关框架).

首先我创建了一个new Google Apps Script project,这将是我的网络钩子.基本上,我希望它在我之前创建的Google文档中记录所有HTTP/POST请求.在Express中,我使用doPost()等于app.post().如果你想更多地了解应用程序脚本的工作原理,可以访问this link),但这不是主要主题.

Code.gs
const doPost = (e) => {
  const doc = DocumentApp.openById(<DOC_ID>)
  doc.getBody().appendParagraph(JSON.stringify(e, null, 2))
}

后来我做了一个new implementation as a Web App,我说任何人都可以访问它,我写下URL供以后使用.这与部署 node 类似.将js应用程序连接到internet.

我在Cloud Console中 Select 了一个项目,如Prerequisites of Cloud Pub/Sub中所示.

在这个项目中,我创建了一个new topic,我称之为GmailAPIPush.之后,点击Add Main(在主题部分的右栏中)并添加gmail-api-push@system.gserviceaccount.comPub/Sub Publisher角色.这是一个requirement,授予Gmail发布通知的权限.

在同一个项目中,我创建了一个订阅.我告诉它是推送类型,并添加我之前创建的Web应用的URL.

这是最关键的部分,它决定了应用程序的工作方式.如果你想知道哪种订阅类型最适合你的需求(推送或拉送),你有一个detailed documentation,可以帮助你在这两种类型中进行 Select .

最后,我们只剩下最简单的部分,配置Gmail帐户以在邮箱上发送更新.我将从应用程序脚本中执行此操作,但它与Node完全相同.

const watchUserGmail = () => {
  const request = {
    'labelIds': ['INBOX'],
    'topicName': 'projects/my_project_name/topics/GmailAPIPush'
  }
  Gmail.Users.watch(request, 'me')
}

一旦函数被执行,我就会发送一条测试消息,瞧,通知就会出现在我的文档中.

回到你揭露的 case ,我将try 用一个隐喻来解释它.想象一下,你有一个邮箱,正在等待一封非常重要的信.当你感到紧张时,你每5分钟go 判断一次信是否已经到达(类似于你建议的setInterval),这使得大多数时候你go 判断你的邮箱,没有什么 fresh 事.然而,你训练你的狗在postman 每次来时吠叫(推送通知),所以你只有在知道你有新信件时才go 查看你的邮箱.

Node.js相关问答推荐

序列化事务未按预期工作

如何在Sequelize with Postgres中将m:n关联表ID从整数迁移到UUID?

如何从基于JSON的HTML/SCSS模板生成PDF?

如何使用NodeJS在mongodb中更新文档

即使卷已设置,Docker Nodemon 也不会热重载

是否可以在 NodeJS 代码库中的每个函数之前和之后添加 console.log?

Gulp 能否向 Docker 发出增量构建的第一次迭代完成的信号?

为什么运行 yarn 命令会出错 - yargs-parser的完整性判断失败

Axios GET 返回不可读的响应

React Native:执行 com.android.build.gradle.internal.tasks.Workers$ActionFacade 时发生故障

无服务器部署使用无服务器组合抛出`spawn serverless ENOENT`

将 express js app.use() 移动到另一个文件

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

在 `DataFrame` 上使用用户定义的可链接函数抽象出 Polars 表达式

Sharp JS 依赖关系 destruct 了 Elastic Beanstalk 上的 Express Server

使用 WebSockets 有服务器成本吗?

如何在客户端使用 node.js 模块系统

MongoDB Node findone如何处理没有结果?

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

在 Node 中连接和缩小 JS 文件