Node 和 Express:如何实现基本的 webhook 服务器

2024-03-26

我很难找到教程。我是 webhooks 的新手,除了对它们应该如何工作的一些基本描述之外,还没有使用或见过它们。

我们的用例是在有新记录时更新 API 的用户。由于我们使用 Kafka 并已确定“最终一致性”,因此另一个用途可能是在无法从 Kafka 流中正确读取/写入记录时通知他们错误。

所以,据我所知,基本概念是:

const express = require("express");
const router = express.Router();

const processSomething = callback => {
    setTimeout(callback, 20000);
}

router.post("/hook", (req, res, next) => {
    processSomething(() => {
        res.status(200).send({
            id: "ABC123",
            message: "New record added!"
        });
    });
});

module.exports = router;

这本质上就是我拍摄的目的吗?用户是否会发布到此端点,等待响应,然后在收到响应后再次发布以重新订阅?这样长期甚至无限期的运行有没有问题?

我确实可以使用更复杂的示例,但我只是找不到它们。当你用谷歌搜索时,你发现的大部分内容都涉及集成第三方 webhook,比如 Github、Slack 等,而不是我需要构建的自定义 webhook。

我也不完全反对另一种方法。只是寻找通知 API 用户更新和其他重要信息的最佳方式。


Webhooks 尝试通知用户延迟事件,但它们以异步方式进行。您的代码是同步的,这意味着用户需要等待回复。我认为它应该看起来更像这样

const express = require("express");
const router = express.Router();

const processSomething = callback => {
  setTimeout(callback, 20000);
}

router.post("/hook", (req, res, next) => {
  processSomething(() => {
    const webhookUrl = req.params.url;

    /**
     * Your Kafka action or something else. There
     * you should collect info about success or
     * fail of client's action.
     */

    /** 
     * Your API call to webhookUrl with 
     * your defined body about status of event
     */
  });

  res.status(200).send('OK')
});

module.exports = router;

其中函数processSomething以异步方式执行操作并通过响应调用客户端的 API,但您的路线仍然通过响应进行应答 -200 OK表示您收到了客户端的消息。

您也可以将有关成功/失败消息的通知委托委托给代码的另一个位置,但您需要保存webhookUrl为了那个原因。在事件系统中,您可以创建事件(或简单消息),其中属性之一是客户端的 url。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node 和 Express:如何实现基本的 webhook 服务器 的相关文章

  • 基于非 HTTP 协议的 REST 示例

    REST 在 HTTP 之外的其他协议上的工作效果如何 对于使用 REST 或可能使用 REST 的协议 是否有任何好的示例 我认为你不会找到很多 但是here https datatracker ietf org doc draft ie
  • Node js 使用中间件重定向进行过多重定向

    在我的 Node js 应用程序 我使用的是express 4 x 中 我想检查用户是否已登录 如果用户未登录 我想重定向到我的登录页面 然后我在中间件中这样做 服务器 js app use function req res next if
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • Jquery从下拉列表中获取所选值的id

    我有一个下拉列表 可以从数据库获取值 如下所示 get getJobs function jobs seljobs jobs var i 0 jobs forEach function n alert job id n id 32 67 4
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • 淡出和循环一组 div 的最佳方式

    假设我有以下 div div class a You are funny div div class b You are smart div div class c You are cool div 最好的展示方式是什么div a持续 5
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • 将 javascript 整数转换为字节数组并返回

    function intFromBytes x var val 0 for var i 0 i lt x length i val x i if i lt x length 1 val val lt lt 8 return val func
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • UnsafeQueueUserWorkItem 以及“不传播调用堆栈”到底是什么意思?

    我正在阅读和学习ThreadScheduler以及有关任务的文章并遇到了该功能ThreadPool UnsafeQueueUserWorkItem用于其中之一MSDN 示例 http msdn microsoft com en us lib
  • 使用 C# 在 XML 中进行 SAML 断言

    这是我面临的问题 需要一些帮助 指导 我已经从我的引擎生成了一条 XML 消息 需要将其解析为服务 为此 我必须将该消息更改为 SOAP 消息并在其上插入 SAML 令牌 我正在尝试使用 C 代码执行此操作 以下是我生成的输入消息及其预期输
  • 如何在 Visual Studio Code 中显示函数的使用?

    我使用 Pycharm 时可以按 ctrl 单击函数定义并查看用途 VSC 中有类似的吗 You can use Find All References Shift F12 to get a better view of usage htt
  • 用连字符替换所有非字母和数字的字符[重复]

    这个问题在这里已经有答案了 我面临着 URL 的问题 我希望能够转换可以包含任何内容的标题 并去掉所有特殊字符 这样它们只有字母和数字 当然我想用连字符替换空格 这将如何完成 我听说过很多关于正则表达式 regex 的使用 这应该可以满足您
  • R - 绘制缺少 NA 值的线

    我有以下 data frame 子集 Time A B C 2016 10 07 06 16 46 NA NA 41 2016 10 07 06 26 27 40 39 42 2016 10 07 06 38 23 NA 40 NA 201
  • 为什么 Django 为代理模型创建迁移文件?

    我刚刚创建了一个代理模型 https docs djangoproject com en 1 9 topics db models proxy models并惊讶地发现manage py makemigrations创建一个新的迁移文件mi
  • 问:在场景滚动时禁用“放大/缩小”

    我们使用基于 Roomle Web SDK 的基础存储库 Roomle UI 我们目前正在对此进行定制并将其相应地集成到我们的网站中 我们想通过滚动禁用自动 放大 它会中断预期的用户流程 不幸的是 我们还没有找到一种方法来实现这一点 而不保
  • c++11 中的 库可移植吗?

    c 11 中的库可移植吗 我避免使用 rand 因为我听说它不可移植 你如何定义 便携 如果 便携式 的意思是 在给定相同输入的情况下将产生二进制相同的随机数序列 那么是的 rand不便携 是的 C 随机生成器 http en cppref
  • Matlab 将文件从 Windows 资源管理器拖放到图形 (gui)

    我想知道有一种方法可以从 Windows 资源管理器中拖动文件并将其放入我的 GUI 中 目标应该是获取文件路径 或文件夹路径 并能够使用我自己的加载函数加载它 我准确地说 我在 Windows 10 64 位中使用 Matlab 2015
  • 如何使用 Javascript 禁用功能键?

    我有一个页面 我需要禁用功能键 主要是 F12 开发工具 我在页面中显示了一些敏感数据 因此无论如何我都无法让用户看到 html 并获取隐藏字段 我检查了一些 javascript 它适用于除了 f1 f12 等功能键之外的几乎所有键 无论
  • SQL Server,无法在主键字段中插入空值?

    我已经准备好在这件事上抓狂了 我对 MS SQL 还很陌生 还没有在任何地方看到过类似的帖子 当我尝试做这样的声明时 INSERT INTO qcRawMatTestCharacteristic VALUES NULL 1 1 1 1 1
  • Neo4j https 通信

    有没有办法只允许 https 而不是 http 与 Neo4j 服务器通信 另外 Neo4j Shell 的通信使用哪个通道 http 还是 https 这是来自 Neo4j 文档 HTTPS 支持 http docs neo4j org
  • Python 的按位求补运算符 (~ 波形符) 是如何工作的?

    为什么 2等于 3 如何 操作员工作 请记住 负数存储为二进制补码的正对应物 作为示例 以下是 2 的二进制补码表示形式 8 位 1111 1110 获得此值的方法是采用数字的二进制表示形式 取其补码 反转所有位 并加一 两个以 0000
  • 有条件地将键值对包含在哈希中[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人可以帮我缩短以下方法吗 我从这个开始 我很喜欢 def self some hash foo gt bar end 现在我想添加一个可选键 我能想
  • 无法重新加载 nginx.service:需要交互式身份验证

    我正在使用 symfony 3 进行项目 项目运行在nginx服务器上 我正在尝试使用以下命令重新加载配置文件 从控制器 systemctl reload nginx Route testReloadConfig public functi
  • 如何枚举 USB 设备*并*对其进行读/写?

    我需要与一个自定义 USB 设备进行通信 它没有特定的驱动程序 该设备不显示为 dev tty I 发现 http www signal11 us oss udev 我该如何使用libudev枚举 USB 设备 假设我设法获得相应的stru
  • Java 中的克隆

    我在网上读到一段关于克隆的内容 但我不太明白 所以有人能解释清楚吗 如果类具有 Final 字段 则无法在克隆方法中为这些字段赋予值 这会导致正确初始化对象的最终字段出现问题 如果最终字段引用对象的某些内部状态 则克隆的对象最终会共享内部状
  • 恢复分页库 3 中的滚动位置

    我将 Paging Library 3 与 RemoteMediator 一起使用 其中包括从网络和本地 Room 数据库加载数据 每次我滚动到 RecyclerView 中的某个位置 导航到另一个片段 然后导航回带有列表的片段时 滚动状态
  • LibGDX 。绘制多行文本

    我正在尝试使用 libGDX 中的 BitmapFont 编写大文本 但它显示在一行上 用户只能看到文本的第一部分 如何使 bitmapFont 自动换行并在屏幕上显示整个文本 要么使用 n用于手动换行并通过渲染字体font drawMul
  • Node 和 Express:如何实现基本的 webhook 服务器

    我很难找到教程 我是 webhooks 的新手 除了对它们应该如何工作的一些基本描述之外 还没有使用或见过它们 我们的用例是在有新记录时更新 API 的用户 由于我们使用 Kafka 并已确定 最终一致性 因此另一个用途可能是在无法从 Ka