web-dev-qa-db-ja.com

Node and Express:基本的なWebhookサーバーの実装方法

チュートリアルを見つけるのに驚くほど苦労しています。私は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;

これは本質的に私が狙っているものですか?ユーザーはこのエンドポイントに投稿し、応答を待ってから、応答を受け取ったら再度サブスクライブするように投稿しますか?これが長期間またはいつまでも実行されることに問題がありますか?

私は本当にもっと洗練された例を使うことができましたが、私はそれらを見つけるだけではありません。これをグーグルで見つけるときに見つけることのほとんどは、Github、SlackなどのサードパーティのWebhookを統合することであり、私が作成する必要があるカスタムではありません。

私も別のアプローチに全面的に反対しているわけではありません。 APIユーザーに更新やその他の重要な情報を通知するための最良の手段を探すだけです。

7
Tsar Bomba

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を保存する必要があります。イベントシステムでは、属性の1つがクライアントのURLであるイベント(または単純なメッセージ)を作成できます。

3
Grzegorz Gajda

あなたは正しい方向に向かっていますが、RESTful APIを構築しようとしているだけだと思います。簡単なエクスプレスAPIの設定について説明した、優れた Scotch.ioの記事 を次に示します。これは、ルーティング、ミドルウェアについて話し、データベースの操作例さえも提供するので、良い例です。彼らは、便利なAPIテストツールであるPostManも使用しています。

EDIT:Opは、RESTful APIだけでなく、Webフックに関するドキュメントを探していたことを示しています...

その場合は、pubサブパターンをお勧めします。 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です。素晴らしいのは ドット表記を使用してサブスクリプションを作成する できることです。

1
Max Baldwin

私が理解している限り、フックバックは、自動化サービスが自動化するエンドポイントにすぎませんPOST自動化された方法で、データを処理してから応答を送信しますが、そうではないと思いますREST apiとは異なり、ファンキーな名前を持っています。

出典:2年前にwebhook APIを作成したことを確認してください。

0
Anthony