web-dev-qa-db-ja.com

HapiでSwaggerをどのように使用する必要がありますか?

Swaggerに移行することを計画している通常のHapiアプリケーションが動作しています。公式の指示に従って swagger-node をインストールし、「swagger projectcreate」を実行するときに Hapi を選択しました。ただし、swagger-nodeとhapiを統合するためのライブラリがいくつかあるように思われるため、今は混乱しています。

  1. hapi-swagger :最も人気のあるもの
  2. hapi-swaggered :やや人気
  3. swagger-hapi :人気がなく、それほどアクティブではありませんが、公式のSwagger Node.jsライブラリ(つまり、 swagger-node )によってHapiプロジェクトのデフォルトとして使用されます

私はswagger-hapiが「公式」アプローチでしたが、Hapiルートでさまざまな構成(承認、スコープなど)を行う方法に関する情報を見つけようとするまでは。また、アプローチは根本的に異なり、swagger-hapiはSwagger定義を入力として受け取り、ルートを自動的に生成しますが、hapi-swaggerとhapi-swaggeredは、単純な古いHapiからSwaggerAPIドキュメントを生成するだけで互いに類似したアプローチを持っているようです。ルート定義。

貢献者の数とダウンロードの数を考えると、hapi-swaggerが進むべき道のようですが、どのように進めるかはわかりません。 Hapiを設定するための「公式の」Swagger方法はありますか?ある場合、認証(できれば hapi-auth-jwt2 または他の同様のJWTソリューションを使用)と承認を設定するにはどうすればよいですか?

編集:私はまた swaggerize-hapi を見つけました。これは、Paypalのオープンソースkraken.jsチームによって維持されているようです。これは、何らかの企業の支援がある可能性があることを示しています(常に良いことです)。 swaggerize-hapiはhapi-swaggerと非常に似ているようですが、後者はすぐに使用できる機能(主にSwagger Editor)を提供しているようです。

18
Kitanotori

編集:ポイント3.質問から、 swagger-hapi が実際に何をするかを理解することは非常に重要です。 swagger-uihtmlを直接提供することはありません。それは意図されていませんが、それは全体の闊歩のアイデアを可能にします(ポイント1と2の他のプロジェクトは実際には少し逆転しています)。下記を参照してください。

swagger-node および swagger-hapi を使用している場合、 swagger)を使用することを除いて、言及した残りのパッケージをすべて必要としないことがわかります。 -ui 直接(とにかく他のすべての人が使用します-依存関係でラップしています)

このハピ/闊歩パズルでこれまでの理解を共有したいと思います。私が費やしたこの8時間が、他の人にも役立つことを願っています。

hapi-swaggeredhapi-swaggered-ui 、また hapi-swagger のようなライブラリ-それらはすべて同じアプローチに従います-説明されるかもしれませんそのように:

You document your API while you are defining your routes

彼らは、 swagger-node の主なアイデアと、あなたが使用していると述べた swagger-cli で作成されたボイラープレートhello_worldプロジェクトとは少し離れています。

swagger-node および swagger-hapihapi-swagger とは異なることに注意してください)は次のように言っています。

You define all your API documentation and routes **in a single centralized place - swagger.yaml**

次に、コントローラーロジックの記述に集中します。 swagger-cliで提供されるボイラープレートプロジェクトは、この一元化された場所swagger.yamlを/ swaggerエンドポイントを介してjsonとして既に公開しています。

さて、上記のすべてのパッケージがUIを表示するために使用している swagger-ui プロジェクトは、静的htmlの束にすぎないため、使用するには2つのオプションがあります。

  • 1)アプリ内からこの静的HTMLをセルフホストする

  • 2)別のWebアプリでホストするか、ファイルシステムから直接index.htmlをロードします。

どちらの場合も、swagger-uiにswagger jsonをフィードする必要があります。これは、上記のように、/swaggerエンドポイントによって既に公開されています。

オプション2)を選択した場合の唯一の注意点は、そのエンドポイントでcorsを有効にする必要があることです。これはたまたま非常に簡単でした。 default.yamlを変更するだけで、corsバグパイプも利用できます。これを行う方法については、これを参照してください スレッド

@Kitanotoriが上で述べたように、プログラムでコードを文書化する意味もわかりません。すべてを1つの場所で記述し、コードとドキュメントエンジンの両方にそれを理解させるというアイデアは素晴らしいものです。

9
akrsmv

Inert、Vision、hapi-swaggerを使用しました。

server.ts

import * as Inert from '@hapi/inert';
import * as Vision from '@hapi/vision';
import Swagger from './plugins/swagger';
...
...
// hapi server setup
...
const plugins: any[] = [Inert, Vision, Swagger];
await server.register(plugins);
...
// other setup

./plugins/swagger

import * as HapiSwagger from 'hapi-swagger';

import * as Package from '../../package.json';

const swaggerOptions: HapiSwagger.RegisterOptions = {
  info: {
    title: 'Some title',
    version: Package.version
  }
};

export default {
  plugin: HapiSwagger,
  options: swaggerOptions
};
1
Mahesh Haldar

Inert、Vision、hapi-swaggerを使用して、swaggerドキュメントを作成およびホストしています。これらのプラグインを正確にこの順序でロードし、InertまたはVisionを構成せず、hapi-swagger構成でtitleなどの基本的なプロパティのみを設定します。

0
Manuel Reil