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!

パラメーター

これをさらに進めることもできます requesth パラメーター。 パラメータを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リストも取得します。

概要

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

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