Node 和 Express:如何实现基本的 webhook 服务器
Posted
技术标签:
【中文标题】Node 和 Express:如何实现基本的 webhook 服务器【英文标题】:Node and Express: How to implement basic webhook server 【发布时间】:2018-10-18 19:53:57 【问题描述】:我很难找到教程。我是 webhook 的新手,除了对它们应该如何工作的一些基本描述之外,还没有使用或见过它们。
我们的用例是在有新记录时更新我们 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 等,而不是我需要构建的自定义。
我也不完全反对另一种方法。只是寻找通知 API 用户更新和其他重要信息的最佳方式。
【问题讨论】:
通知用户更新是一个出站调用。我不确定你在问什么;您的用户将如何向您提供他们的端点以调用更新?如何进行更新调用? @DaveNewton 这正是我要问的。 【参考方案1】: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。
【讨论】:
这可能正是我所追求的,谢谢。这是我不确定的过程/流程。这似乎是最有意义的。会试一试的!【参考方案2】:您正朝着正确的方向前进,但我认为您只是想构建一个 RESTful API。这是一个很好的article from Scotch.io,它谈到了设置一个简单的快速 API。这是一个很好的例子,因为他们谈论路由、中间件,甚至给你一个使用数据库的例子。他们也使用 PostMan,这是一个方便的 API 测试工具。
编辑: Op 表示他确实在寻找有关网络挂钩的文档,而不仅仅是 RESTful API...
在这种情况下,我会推荐 pub sub 模式。我使用这种模式是因为像 Github 的 web hook API 或 GCP 的 cron job API 这样的 web hook 并不真正关心你的 API 的响应。因此,我通常会做的是让我的应用程序中的 web hook 路由简单地发出一个事件,然后解析从 web hook 发送的 API 请求。然后事件发射器将触发一个侦听器,所需的进程将启动。像这样的...
const Router = require('express').Router();
const eventEmitter = require('./eventEmitter');
// sets event listener
const listener = require('./eventListener');
Router.post('/webhook', (req, res) =>
eventEmitter.emit('pubsub', req.body);
res.status(200).send('success');
);
module.exports = Router;
然后在eventListener.js
...
const emitter = require('./eventEmitter');
emitter.on('pubsub', function(requestBody)
// Do what you want
);
最后一件事,这是我在其他项目中使用的一个很棒的 pubsub npm。最棒的是你可以create subscriptions using dot notation。
【讨论】:
欣赏这一点,但我已经构建了许多 API。我正在寻找的具体是提供 webhook 作为 API 回调。一个常见的模式,但我没有看到很多例子。对这些技术中的任何一项都不陌生,只是这种模式。谢谢。 @TsarBomba 道歉!我相应地更新了我的答案【参考方案3】:据我了解,hookback 只是自动化服务将以自动化方式发布到的端点,您处理数据然后发送响应,我认为它与 REST api 没有什么不同,只是有一个时髦的名字。
来源:很确定几年前我构建了一个 webhook API,这就是我发现的
【讨论】:
在源头哈哈 :) @Anthony 感谢来源:P 但开玩笑。在开始创建自己的 webhook 演示之前,我感到很困惑,因为它看起来就像 rest api,我无法说服自己,有细微的差别。无论如何快进,我仍然对此感到困惑。如果客户每 10 秒继续发布到休息端点,那么它有什么不同。请添加更多解释或提供一些我可以学习的“来源”。我最终在这里做我自己的研究。我知道这是一个旧答案,但我希望看到您的回复。安全:)以上是关于Node 和 Express:如何实现基本的 webhook 服务器的主要内容,如果未能解决你的问题,请参考以下文章
如何在 node.js 服务器上的 PHP Web 服务器和 Socket.io 之间创建握手?
node + express +mongoose 实现基本登录注册