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 实现基本登录注册

Node.js Express 框架

如何在 Express (Node.js) 中使用 URL 编码处理 HTTP 基本身份验证

如何使用 Node 和 Express 正确提供动态图像?

会话如何在 Express.js 和 Node.js 中工作?