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

Tsa*_*mba 12 javascript rest webhooks node.js express

我很难找到教程。我是 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;
Run Code Online (Sandbox Code Playgroud)

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

我真的可以使用更复杂的例子,但我只是没有找到它们。您在谷歌搜索时发现的大部分内容都涉及集成第三方 webhooks,如 Github、Slack 等,而不是我需要构建的自定义。

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

Grz*_*jda 5

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;
Run Code Online (Sandbox Code Playgroud)

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

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