web-dev-qa-db-ja.com

Hapi.jsアプリケーションアーキテクチャ

私はhapi.jsアプリケーションに取り組んでおり、次のアーキテクチャを使用しています。

Database
  --Models
    --usermodel.js
    --anothermodel.js
Routes
  --private
    --controllers
      --ctrl1.js
      --ctrl2.js
    --validators
      --validatr1.js
      --validtr2.js
  --public
    --controllers
      --ctrl1.js
      --ctrl2.js
test
  --dbtest.js
  --functiontest.js
server.js

expressで作業するときにこの構造を採用しましたが、新しいアプリケーションから始めて、より良いアプリケーション構造を見つけることができるリソースがあるかどうか疑問に思いました。 hapiやその他のリソースについて公式ウェブサイトを調べましたが、興味深いものは見つかりませんでした。

助けていただければ幸いです。ありがとう。

13

Hapiの良いところは、アプリをどのように構成するかを指示しないことです。あなたの人生で意味のあることは何でも、それはあなた次第です。 couldすべてを1つのindex.jsファイルに入れ、stillすべてのhapi機能を使用しますが、おそらく読むのに苦労するでしょう/後でその毛玉を維持します。

以前に使用した上記の構造がアプリケーションにとってまだ意味がある場合は、同じまたは類似の構造を使用することを妨げるものは何もありません。

models-データベースと通信するhapi固有ではないノードモジュールのみ

exports.getUser = function (id, callback) { 

    Db.get('users', id, callback) 
};

controllers-ルートハンドラーをエクスポートするモジュール

var User = require('../models/user');

exports.showUserPage = function (request, reply) {

    User.getUser(request.params.id, function (err, user) {

        if (err) {
            throw err;
        }

        if (!user) {
            return reply('User not found').code(404)
        }

        reply.view('user', user);
    });
}

validators-joiスキーマをエクスポートするモジュール

exports.showUserPage = {
    params: {
        id: Joi.number().required()
    }
} 

server.js-すべてを接着する場所

var Hapi = require('hapi');

var server = new Hapi.Server();
server.connection({ port: 7843 });

server.route({
    method: 'GET',
    path: '/users/{id}',
    handler: require('./controller/users').showUserPage,
    config: {
        validate: require('./validators/users').showUserPage
    }
});

server.start();

プラグイン

plugins を利用する必要があります。これにより、アプリケーションを論理チャンクに分割できます。上記の構造を引き続き使用できますが、プラグイン内に配置します。後で追加する新機能は、関連性がない場合(分析、ストアなど)、別のプラグイン内に入れることができます。これにより、スケーリングが必要なアプリケーションの特定の部分のみを簡単にスケールアウトできるマイクロサービスアーキテクチャを構築できます。

他の人は何をしていますか?

可能であるという理由だけで変更したい場合は、hapiで既に構築されているいくつかのプロジェクトを見て、それらがどのように行っているかを確認してください。

7
Matt Harrison

私は チャットアプリケーション を構築してきました、そして以下は私が使用したものです:

  1. エンティティのコントローラー/バリデーターとルートを1つのフォルダーにグループ化します。
  2. ユーティリティを共通フォルダ内にグループ化します。
  3. 認証と関連タスクを別のフォルダーに保管します。
  4. bootstrapタスク用に別のフォルダーを保持します。
  5. フォルダ内のすべてのファイルの接着剤として機能するindex.jsを使用して、各フォルダをグループ化します
  6. 相対パスアクセスを回避するために、フォルダーごとにpackage.jsonを追加します。
  7. dotenvを使用して環境変数をロードします。

モジュール性は、Angularスタイルガイドラインをいくつかの場所で読んだことに触発されました。ここでは、エンティティによるモジュールのグループ化に重点が置かれています機能の代わりに。

以下は私のプロジェクトアーキテクチャです:

auth
 -- index.js
 -- package.json
modules
  --user
    --controller.js
    --validator.js
    --index.js
  --group
    --controller.js
    --validator.js
    --index.js
  --index.js
  --package.json
database
  --models
    --user.js
    --group.js
  --index.js
  --package.json
bootstrap
 --users.js
  --groups.js
  --index.js
  --package.json
test
  --user
    --model.js
    --route.js
    --index.js
  --index.js
  --package.json
app.js 
2