Node.jsエコシステムの優れている点は、アプリケーションの作成を検討している場合、それを支援できるモジュール/フレームワークが存在する可能性が高いという事実です。 この記事では、hapi.jsを使用して基本的なRESTAPIを作成します。

Node.jsとExpressを使用したAPI開発とルーティングにも興味があるかもしれません。

新しいプロジェクトを作成してhapiをインストールすることから始めましょう。 開始するには、ターミナルで次を実行します。

# Create a new directory for the project
$ mkdir hapi-api && cd hapi-api

# Initialise a new Node project
$ npm init -y

# Install hapi.js
$ npm install hapi

# Create a new server file
$ touch index.js

# Install nodemon
$ npm i nodemon -g

# Run server with nodemon
$ nodemon index.js

nodemon を使用して、サーバーを監視モードで起動しています。

最初に行う必要があるのは、サーバーを作成することです。 ありがたいことに、これはNode.jsで簡単です!

サーバーの作成

const Hapi = require('hapi');

const server = Hapi.server({
  port: 3000,
  host: 'localhost'
});

const start = async () => {
  await server.start();
};

start();

サーバーは現在localhost:3000を待機しています。 次に、/ルートで応答するようにルーティングを設定します。

server.route({
  path: '/',
  method: 'GET',
  handler: (request, h) => {
    return 'Hello, hapi!';
  }
});

curlを使用するか、 Postman などのGUIベースのプロジェクトを使用することで、これが期待どおりの結果を返すかどうかを確認できます。

$ curl http://localhost:3000/

> Hello, hapi!

Hello, hapi!

パラメーター

requestおよびhパラメーターを使用して、これをさらに進めることもできます。 パラメータをURLに渡す機能を追加しましょう:

server.route({
  path: '/',
  method: 'GET',
  handler: (request, h) => {
    return 'Hello, hapi!';
  }
});

server.route({
  path: '/{id}',
  method: 'GET',
  handler: (request, h) => {
    return `Product ID: ${encodeURIComponent(request.params.id)}`;
  }
});

この小さな例では、特定の製品を返すAPIがあることを想像しています。 ユーザーがhttp://localhost:3000/123を要求するたびに、次の情報が返されます。

Product ID: 123

これは、request.paramsオブジェクトに、パスに設定したパラメータが含まれているためです。

idを2つの中括弧{id}で囲んでいることに注意してください。これは、ユーザーがURLのその部分をパラメーターとして置き換えることを意図していることをhapiに通知します。

同時に、元のルートなしでidも維持しました。 これは、同様の基本パターンをターゲットとする複数のルートを持つことができ、それらが互いにオーバーライドしないことを示しています。 それぞれがより具体的になり、特定のルートと一致しない場合は、一致するまでスタックを振り返ります。

この例ではGETを見てきましたが、他のHTTP動詞の処理も同様に行われます。 詳細については、hapiドキュメント内のルーティングを確認してください。

プラグイン

hapi内でプラグインを使用することもできます。 goodプラグインを使用して、ロギング機能の能力を高めましょう。 ターミナルで以下を実行して、必要なパッケージをインストールします。

$ npm install good good-console good-squeeze

次に、プラグインの初期化に使用できるconsoleLoggingオブジェクトを作成する必要があります。

const consoleLogging = {
  plugin: require('good'),
  options: {
    ops: {
      interval: 1000
    },
    reporters: {
      consoleReporter: [
        {
          module: 'good-squeeze',
          name: 'Squeeze',
          args: [{ response: '*', log: '*' }]
        },
        { module: 'good-console' },
        'stdout'
      ]
    }
  }
};

次に、これをstart関数内に登録できます。

const start = async () => {
  await server.register([consoleLogging]);

  await server.start();
};

これは、APIにアクセスするたびに、コンソールにイベントを記録することを意味します。 ブラウザ内のhttp://localhost:3000/に移動してこれを試すことができます。または、curlを使用することもできます。

$ curl http://localhost:3000/

これにより、次の結果が得られます。

(Pauls-MacBook-Pro) [response] http://localhost:3000 : get / {} 200 (16ms)

多田! 🎉これで、hapiサーバーで発生するすべてのアクションの自動ログが作成されました。

ファイルの提供

ファイルを提供するにはどうすればよいですか? 良い質問! 新しいindex.htmlページを作成しましょう。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>hapi Todo List</title>
  <style>
  body {
    background-color: #6624fb;
    color: white;
  }

  .container {
    display: flex;
    height: 93vh;
    justify-content: center;
    flex-wrap: wrap;
    flex-direction: column;
    align-items: center;
  }

  .completed {
    text-decoration: line-through;
  }

  ul {
    padding: 0px;
    margin: 0px;
  }

  li {
    font-size: 24px;
    list-style:none;
  }
  </style>
</head>
<body>
  <div class="container">
    <h1>Todo List</h1>
    <ul>
      <li class="completed">Learn about Hapi.js</li>
      <li>Read more articles on Alligator.io</li>
      <li>Drink less coffee</li>
    </ul>
  </div>
</body>
</html>

その後、インデックスルート(または別のルートまたは選択したルート)からこれを提供できます。 これを行うには、最初に静的ファイルを提供するために使用されるinertモジュールをインストールする必要があります。

ありがたいことに、hapiアプリ内でプラグインを登録する方法をすでに学びました! ターミナルで次のコマンドを実行して、inertをインストールします。

$ npm install inert

次に、inertを次のように登録します。

const start = async () => {
  /** 
    Note: You can also require inert as a variable like so:
    const Inert = require('inert');

    await server.register([Inert]);
  **/
  await server.register([consoleLogging, require('inert')]);

  await server.start();
};

/に移動すると、コンソール内にログが表示されるだけでなく、Todoリストも取得されます。

Serving static files with hapi

概要

これで、hapiを起動して実行するのに十分ながわかりました。 この記事の中で議論されている概念をより詳細に見るさらなる記事をお楽しみに!

この記事のコードはこのリポジトリで見つけることができます