この記事では、Midmareの特徴と機能について説明するとともに、独自のライブラリを作成した経験を共有します。
バックグラウンド
私が使用している製品は現在、移行プロセス中です。それが終わるまで、私たちは2つのプラットフォームに並行して存在し、レガシーから離れます。新しいプラットフォーム用のWebアプリケーションバックエンドを実行しています。一部のプロセスは、他のチームと常に統合する必要があります。
これらの機能を考慮に入れると、既存のバックエンドを書き換えるための柔軟で普遍的なソリューションを見つける必要がありました。このソリューションは、ミッドメアライブラリでした。
入門タスク
ライブラリをTypeScriptとJavaScriptの両方で使用できるようにするためのタスクがありました。同時に、チームは開発をスピードアップするために、TSからJSにコードを完全に書き直すことを目指しました。
JSは型指定されていないため、安定性は劣りますが、開発ははるかに高速です。十分なテストを書いて身を守るために計画したように、私たちは喜んでそのようなリスクを冒しました。
最初は、1週間半の間、コンセプトについて考え、さまざまなオプションを検討しました。機能的なアプローチを使用して、結果なしに実行のチェーンにリンクを挿入できるようにするのがクールだと思うまでは。
ミドルウェアを使うというアイデアを思いついた
つまり、次々に実行され、互いのエラー(エラー、問題、データ変更など)に反応する一連の中間処理機能を作成することです。
それで、私はミドルウェアのスタックを手に入れました。これは原則としてコアに似ています。この類似性により、ライブラリの残りの部分が使いやすくなります。しかし、ミッドメアではメソッドが大幅に少なく、4つしかありません。ミッドメアライブラリ自体は最小限です。
仕事の始まり
Midmareをインストールする前に、Node.jsバージョン10以降をダウンロードしてインストールする必要があります。新しいプロジェクトを作成するときは、最初にnpminitコマンドを使用してpackage.jsonも作成する必要があります。
Midmareのインストールは、npm installmidmareコマンドを使用して実行されます。
以下は、アプリケーションの初期化の例です。ルーターを使用
したミッドメアでの一般的なアプリケーションの初期化
(ルーターレベルのミドルウェア)
ミッドメアの機能
何よりもまず、印象的なコード分解機能について話します。中間機能(ミドルウェア)はお互いについて何も知らないかもしれません。データを取得して処理し、さらにリリースするだけです。
Midmareライブラリは、ソースと宛先の異なるAPIに同じルーティングシステムを使用する必要がある場合に最適です。つまり、特定の共通処理ノードを作成する必要がある場合です。ただし、より単純なアプリケーションを作成することもできます。
Midmareの機能を強調するためのいくつかの例を次に示します。
中間関数を使用してエラーをキャッチします。彼はコード分解の例でもあり
ますルートの不一致の場合にHTTPセッションを閉じる単純な中間関数
コマンドの処理の例、この場合はRedisにデータを送信します
小さなライブラリはほとんど機能しませんが、利用できるオプションを制限するものではありません。Midmareでは、アーキテクチャの構築方法に戸惑うことなく、事実上何でも接続できます。
主な利点
このライブラリの主な利点は、任意のレイヤー(HTTP、WSなど)から完全に分離できることです。 KoaがHTTPサーバー用に設計されている場合、Midmareはこの点に関して制限を作成しません。
ターミナルユーティリティを作成することもできます。 Midmareでは、でパラメータを使用できるため、これは便利
path
です。以下の例のように:
Midmareを使用すると、同じHTTPサーバーに戻ることができます。接続するのは難しくありません。HTTP用の既製のルーターがすでにあります。
ただし、WebSocketを安全に接続することもできます。 WebSocketsクライアント自体を初期化する必要があります。そして、それは最も単純なルーティング次第です。
HTTPおよびWebSocketをMidmareと組み合わせる例
この汎用性により、1つのプログラムで同じ問題を解決するためにさまざまな方法を検討する必要がなくなります。
実際、どのようなアイデアも制限なしにライブラリに適用できるため、実装のすべての可能性を列挙することはかなり困難です。
このフォーマットの既製のライブラリを見たことがありません
つまり、完全なアナログです。低レベルのバインディングがなくても、WebSocket、HTTP、またはより一般的には、ネットワーク通信やソフトウェアがOS自体で機能します。
Midmareは、文字通り5〜6行のチューニングですべてを同時に実行できます。
そして、その背後にある考え方は非常に単純です-呼び出しにnext / sendメソッドを使用して関数の実行のチェーンを構築することです。それ以上呼び出す必要がない場合、プログラムは停止します。プラスルーティング、マイナスHTTP-そしてミッドメアがあります。
なぜこのライブラリを使用するのですか?
いつでも独自のソリューションを作成できます。もちろん、この場合、分解またはコード自体が不完全である可能性があります(たとえば、チェーンのステップ間にウェッジすることができない場合があります)。そのような欠陥がたくさんある場合、手書きのプログラムは1、2年で悪い結果になる可能性があります。Midmareはこれを回避します。
その上、プログラマーの世界にはフィルターが多すぎます。誰かがTypeScriptで、誰かがJSで書きたいと思っています。私は両方のオプションをキャプチャするためのソリューションを探していました。
今、私はミッドメアを積極的にテストして改良しようとしています。
小さなライブラリの大きな利点は、その作成者が積極的にサポートしていることです。
私は毎日ライブラリをテストしているので、落とし穴や欠陥をすばやく見つけます。小さなライブラリを使用すると、問題をすぐに修正できます。
周期的な呼び出しは、修正された問題の最初のものです
以下の例を見てみましょう
。.process( '/ message')ステップに '/ send'呼び出しを追加する必要があるが、.process( '/ send')にはすでに '/ message'呼び出しが含まれているとします。次に、ステップ#2はステップ#1を呼び出します。この場合、ステップ#1では、ステップ#2の呼び出しが毎回トリガーされ、以下同様に循環します。
ライブラリの作成に取り組むときは、そのような問題を見つけてユーザーに見せ、何が問題になっているのかを説明する必要があります。
この場合、最大コールスタックサイズ超過エラーが発生し、同じ関数への複数の再帰呼び出しに応答してJSがクラッシュします。
このライブラリでのこの問題の解決策は次のとおりです。パス履歴を1つのコンテキストに保持します。つまり、 `ctx.send`またはʻapp.send`への各呼び出しには、独自の呼び出し履歴があります。
Midmareにはこの点に関するハンドルがあるため、ループで呼び出されると、ライブラリはエラーをスローします。
循環呼び出しが必要な場合があります。たとえば、2つの中間関数は、ループから抜け出す可能性があるため、同じデータを異なる方法で処理します。つまり、関数の1つにif-elseが含まれている場合、これはelseで機能し、循環呼び出しを無視します。
実装に循環性が必要な場合、Midmareには、「ignoreCycleError:true」を介してエラーを無視するように設定するオプションがあります。
図書館はそのコミュニティを待っています
原則として、このような純粋なライブラリに何かを追加することは意味がありません。プラグインを接続する機能を追加すると便利ですが、ミドルウェアを使用すると、新しい機能がなくてもこれを解決できます。
特定のケースで一部の処理が欠落している場合は、条件付き4行に自分で追加できます。HTTPセッションを閉じる関数の例のように、
すべての追加処理を別のリポジトリに移動できます。または、ルーターをリポジトリに配布します。すべてが同じ方法で接続および処理されます。
ライブラリが今本当にやりたいのは、ライブラリから独自のツールを構築するコミュニティです。したがって、私はコミュニティに図書館の発展に貢献することを勧めます。参加してテストします。
著者:Ivan Petushinsky、シニアNode.js開発者