Узел и Экспресс: Как реализовать базовый сервер webhook - PullRequest
0 голосов
/ 08 мая 2018

Мне удивительно трудно найти учебники. Я новичок в вебхуках и не использовал и не видел их, за исключением некоторых основных описаний того, как они должны работать.

Наш вариант использования для этого - обновление пользователей наших 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;

Это то, ради чего я стреляю? Будут ли пользователи отправлять сообщения в эту конечную точку, ждать ответа, а затем отправлять сообщения после получения ответа, чтобы повторно подписаться? Есть ли проблема с этим запуском в течение длительного периода или даже бесконечно?

Я действительно мог бы использовать более сложные примеры, но я просто не могу их найти. Большая часть того, что вы обнаруживаете при поиске в Google, включает в себя интеграцию сторонних веб-хуков, таких как Github, Slack и т. Д., А не пользовательских, что мне нужно построить.

Я тоже не против другого подхода полностью. Просто поиск лучшего способа уведомления пользователей API об обновлениях и другой важной информации.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Насколько я понимаю, обратная связь - это просто конечная точка, к которой автоматическая служба будет автоматически отправлять POST, вы обрабатываете данные и затем отправляете ответ. Я не думаю, что это отличается от API REST. просто имеет прикольное имя.

Источник: Я уверен, что пару лет назад я создал API webhook, и это то, что я обнаружил

0 голосов
/ 08 мая 2018

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 клиента.

0 голосов
/ 08 мая 2018

Вы движетесь в правильном направлении, но я думаю, что вы просто хотите создать RESTful API. Вот хорошая статья из Scotch.io , в которой говорится о настройке простого экспресс-API. Это хороший пример, потому что они говорят о маршрутизации, промежуточном программном обеспечении и даже дают пример работы с базой данных. Они также используют PostMan, который является удобным инструментом тестирования API.

EDIT: Оп указал, что он действительно искал документы по веб-хукам, а не просто RESTful API ...

В этом случае я бы порекомендовал суб-шаблон паба. Я использую этот шаблон, потому что веб-хуки, такие как API веб-хука Github или GCP API Gron, на самом деле не заинтересованы в ответе от вашего API. Поэтому, что я обычно делаю, так это чтобы мои маршруты веб-хуков в моем приложении просто генерировали событие и затем обрабатывали запрос 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, который я использую в других проектах. Замечательно то, что вы можете создавать подписки, используя точечные обозначения .

...