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

Javascript Node和Express:如何实现基本的webhook服务器,javascript,node.js,rest,express,webhooks,Javascript,Node.js,Rest,Express,Webhooks,我很难找到教程。我对webhooks还不熟悉,除了一些关于它们应该如何工作的基本描述之外,我还没有使用或见过它们 我们的用例是在有新记录时更新API的用户。由于我们使用的是Kafka,并且已经确定了“最终一致性”,所以另一个用途可能是在无法从Kafka流正确读取/写入记录时通知他们错误 因此,就我所能看到的基本概念是: const express = require("express"); const router = express.Router(); const processSometh

我很难找到教程。我对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用户更新和其他重要信息的最佳方法。

您正朝着正确的方向前进,但我认为您只是想构建一个RESTful API。下面是一个关于设置一个简单的expressapi的好例子。这是一个很好的例子,因为他们讨论了路由、中间件,甚至给了您一个使用数据库的示例。他们还使用PostMan,这是一个方便的API测试工具

编辑: Op表示他确实在寻找web钩子上的文档,而不仅仅是RESTful API

在这种情况下,我建议采用酒吧分店模式。我使用这种模式是因为像Github的web钩子API或GCP的cron作业API这样的web钩子并不真正关心API的响应。因此,我通常会让我的应用程序中的web钩子路由发出一个事件,然后解析从web钩子发送的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,我在其他项目上使用。最棒的是您可以。

据我所知,回接只是一个端点,自动化服务将以自动化的方式发布到该端点,您处理数据,然后发送响应,我认为它与REST api没有任何不同,只是有一个时髦的名称


资料来源:我确信几年前我构建了一个webhook API,这就是我发现的

webhook试图用延迟事件通知用户,但他们是以异步方式进行的。您的代码是同步的,这意味着用户需要等待回复。我想应该是这样的

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
表示您收到了来自客户端的消息


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

通知用户更新是一个出站呼叫。我不知道你在问什么;您的用户将如何向您提供其端点以调用更新?如何进行更新呼叫?@DaveNewton这正是我在这里要问的。感谢你,但我已经构建了很多API。我特别想要的是,提供Webhook作为API回调。一个常见的模式,但我没有看到很多例子。这些技术中的任何一种都不是新技术,只是这种模式。谢谢。@TsarBomba道歉!我更新了我的答案,这可能正是我想要的,谢谢。这是我不确定的过程/流程。这似乎是最有意义的。我会试一试的!笑在来源:)@Anthony谢谢来源:P但是笑话放在一边。在开始创建我自己的webhook演示之前,我感到很困惑,因为它看起来完全像RESTAPI,我无法说服自己,有一点不同。无论如何,快进一步,我仍然对此感到困惑。如果客户机每10秒就向rest端点发送一次日志,那么它是如何不同的。请添加更多解释或提供一些我可以学习的“来源”。我在这里做我自己的研究。我知道这是一个古老的答案,但我希望看到你的答复。注意安全:)