NodeJS、Express、および MySQL を使用して Rest API を構築する方法

JavaScript と MySQL の知識があれば、Express を使用して NodeJS API を構築できます。

私はいくつかの調査を行い、ゼロから API を開発しようと試みました。

このガイドでは、ゼロから API を構築する方法を紹介します。
ルートの作成方法、
mysql2 の使用方法、データベースへの設定と接続方法、および準備されたステートメントを使用してクエリを実行する方法について学びます。
req、res、next callback以外に追加の引数を取得できるミドルウェアの作成方法。
Express Validatorモジュールを使用して、リクエストオブジェクトからデータをチェックする方法について学びます。
JWT モジュールを使用して、ユーザー用のトークンを作成し、トークンを検証し、トークンに格納されているオブジェクトを取得する方法を学びます。
さらに、ユーザーの役割に基づいて、特定のルートへのアクセス許可を提供する方法を学びます。

テクノロジーおよびパッケージ。

  • NodeJS
  • Express
  • mysql2
  • bcryptjs
  • jsonwebtoken
  • express-validator
  • dotenv
  • cors

MySQL をインストールしてください。

私は WSL を使用しています。このチュートリアルを使用して、WSL に MySQL をインストールする方法を見ることができます。

sudo service mysql status

Enter fullscreen mode Exit fullscreen mode

起動していない場合は、このコマンドを使用してMySQLが起動していることを確認する必要があります。

sudo service mysql start

Enter fullscreen mode Exit fullscreen mode

Application overview:

ユーザーの作成、読み取り、更新、削除といった CRUD 操作のためのレスト API を構築します。

プロジェクト フォルダーを作成し、依存するすべてのコンポーネントをインストールします。

mkdir mysql-node-express && cd mysql-node-expressnpm init -ynpm i express express-validator mysql2 cors dotenv jsonwebtoken -Snpm i nodemon -D
Enter fullscreen mode Exit fullscreen mode

package.json ファイルに移動して “main” 値を “src/server.” に変更します。js “に変更し、これらのスクリプトをscriptsオブジェクトに追加します:

"start": "node src/server.js","dev": "nodemon"
Enter fullscreen mode Exit fullscreen mode

package.json はこのようになります:

Create .env file.json.js。

私たちは、すべての環境変数を管理するために、.env ファイルを使用します。
.env ファイルは、ENV VARIABLE = VALUE 構文を使用して、環境変数をカスタマイズできるようにする隠しファイルです。
これらの変数は、すでにインストールされている dotenv モジュールを使用して読み込まれます。
.env ファイルは、環境の異なる段階 (開発 / ステージ / 本番環境) で定義できます。

.env ファイルを作成し、次の行をコピーして、MySQL db_name, db_username, およびパスワードでファイルを更新します。

# DB ConfigurationsHOST=localhostDB_USER=db_usernameDB_PASS=db_passwordDB_DATABASE=db_name# local runtime configsPORT=3000SECRET_JWT=supersecret
Enter fullscreen mode Exit fullscreen mode

nodemon.json ファイルを作成します。

Nodemonは、ターゲットディレクトリでファイルの変更が検出されたときに、自動的にnodeアプリケーションを再起動することにより、node.jsベースのアプリケーションの開発を支援するツールです。
nodemonは、nodeの代替ラッパーです。 nodeコマンドを使用する代わりに、コマンドラインでnodemonコマンドを使用してスクリプトを実行します。
コマンドラインでnodemonを実行しながら、次のような設定スイッチを簡単に追加することができます。json)ですべてのスイッチを指定することもできます。
あるディレクトリ内の複数のファイルを監視したい場合、watch配列でディレクトリを追加します。
特定の拡張子 (ts ファイルなど) を検索したい場合は、「ext」プロパティを使用します。
いくつかのファイルを無視したい場合は、「ignore」配列で定義するなど…
このファイルは主に typescript に基づいて NodeJS でサーバーを作成するときに使用しますが、アプリの設定を含める場所がもっとあると簡単だと思います。
このファイルはオプションです。

nodemon.jsonファイルを作成し、このファイルを追加します:

{ "watch": , "ext": ".js", "ignore": }
Enter fullscreen mode Exit fullscreen mode

srcフォルダを作成します。

mkdir src && cd src
Enter fullscreen mode Exit fullscreen mode

src フォルダに controllers, models, routes, middleware, db, and utils というサブフォルダを作成する。

mkdir controllers models routes middleware db utils
Enter fullscreen mode Exit fullscreen mode

Setup Express server.Setupを実行します。

src ディレクトリに server.js を作成し、以下の行をコピーします。

このファイルでは、残りの API を構築するために express をインポートし、JSON ペイロードで受信要求を解析するために express.json() を使用します。env 設定ファイルを読み込んで、サーバーを実行するためのポート番号を取得します。

さらに userRouter もインポートします。

その後、404 エラーを処理するミドルウェアがあります。 その後、前のルートからエラーデータを取得するエラーミドルウェアを使っています。next(err)が呼ばれると、例として404ミドルウェアを見ることができます。
.envファイルからポートをリスンし、サーバが動いていることをコンソールに表示します。

MySQLデータベースとユーザテーブルを作成します。

db ディレクトリに create-user-db.sql ファイルを作成し、以下の行をコピー ペーストします。

このスクリプトでは、まずデータベースが存在すれば削除し、間違いがあった場合にすぐにリセットできるようにし(必要であればこの行をコメントできます)、次にデータベースが存在しない場合は作成します。 このデータベースをアクティブなデータベースとして設定し、すべてのカラム (id、username など) を含む “user” テーブルを作成し、必要であれば簡単にリセットできるようにします。 wsl を使用している場合、db ディレクトリで次のコマンドを実行できます:

mysql -u -p < create-user-db.sql
Enter fullscreen mode Exit fullscreen mode

Configure and Connect to MySQL database:

dbディレクトリにdb-connection.jsという追加ファイルを作成し、これをコピーペーストします。

このファイルでは、まずdotenvモジュールをインポートして、.envファイルからdbホスト、dbユーザーなどのデータベース設定情報を読み取るのに使います。

データベースに問題がある場合は接続をチェックし、その後接続を解除します。

クエリの結果の約束を返すクエリ メソッドを持っています。

共通の MySQL エラーを捕捉し、適切な HTTP ステータス コードとメッセージを返すために try-catch ブロックを使用します。

ファイルの最後に、DBConnection クラスのインスタンスを作成してクエリ メソッドを使用し、(次のステップで見る)モデル .js で、クエリ メソッドを再び使用します。

エラー ハンドラの作成。

次に、エラー ハンドラを作成します。

そのために、まず、utils ディレクトリの下に HttpException.utils.js ファイルを作成し、以下をコピー ペーストします。

HttpException クラスは Error クラスを継承します。
コンストラクターはステータス、メッセージ、およびデータを取得します。 super(message) を使用してメッセージ変数を親コンストラクタに渡し、ステータス、メッセージ、およびデータのインスタンス変数を初期化します。

その後、middleware ディレクトリにミドルウェア エラー ハンドラーを作成します。js ファイルを作成し、以下をコピー ペーストします:

ファイルの下部で、オブジェクトがどのようになるかを確認できます。

ミドルウェアは req、res、および next コールバックを取得しますが、追加の引数として error も取得します(このミドルウェアにたどり着く前に next(error) を使用することで)。

エラー オブジェクトから変数を取得するために構造化を使用し、以前に設定されていない場合はステータスを 500 に設定します。

この後、ステータスが 500 であろうと、ユーザーが失敗の正確な性質を明らかにせずに汎用内部サーバー エラー メッセージを受け取るようにメッセージを必ず変更することにします。

その後、type、status、および message プロパティを持つエラー オブジェクトを作成します (data はオプション)。

utils (helpers) ファイルを作成します。

utils ディレクトリに、さらに 2 つのファイル common.utils.js と userRoles.utils.js を作成します。

common.utils.js:

この関数は、キーと値のペアで準備されたクエリの複数のフィールドを設定するのに役立ちます。
ColumnSet キー =? ペアの配列、
したがって、値は columnSet 配列と同じ順序でなければなりません。

userRoles.utils.js:

module.exports = { Admin: 'Admin', SuperUser: 'SuperUser'}
フルスクリーンモードに入ります フルスクリーンモード終了

Async 関数を作成。

ミドルウェアのディレクトリに awaitHandlerFactory.middleware.js という別のファイルを作成し、これをコピーペーストします:

一般に、ミドルウェアは req, res, next 引数を取得する非同期メソッドでしかないことがわかっているので、このミドルウェアで追加の引数を取得したい場合はこのようにします(次のステップで認証ミドルウェアにもこの方法を用います)。

この関数はコールバックを取得し、ミドルウェアのスクリプトを実行し、try ブロックでこのコールバックを起動しようとします。
ここで何か問題が発生した場合は、エラーをキャッチして next(err) を使用します(次のミドルウェア => error.middleware.js に転送します)。

認証ミドルウェアを作成します。

必要なもう1つのミドルウェアは、JWTモジュール経由でユーザーの権限をチェックするために使用するauthミドルウェアです。

awaitHandlerFactory.middleware.js のミドルウェアと同様に、ここでは追加の引数(これはオプション)=> roleを要求するミドルウェアを用意しています。

キャッチエリアのエラー ステータスを 401 に調整するために try-catch を使用しました (トークンの有効期限が切れた場合など)。

最初は req.headers.authorization を探します。ヘッダーで定義されていない場合、またはヘッダーが “Bearer ” で始まらない場合、ユーザーは 401 応答を受信します。

トークンを検証するには、jwt.verify 同期関数を使用します。トークンおよび secretKey を引数として取得し、署名が有効かどうか、有効期限、オーディエンス、発行者のオプションフィールドが有効かどうか、復号されたペイロードを返します。

さて、ユーザーIDを検索して、このトークンを持つユーザーを見つけることができます。
もしそのユーザーがもう存在しなければ、何の情報もなく401の例外を受け取ります。
ユーザーが存在する場合、現在のユーザーが彼のルートを検索するオーナーであるかどうか、またはユーザーがこのルートにアクセスするロールを持っているかどうかを確認します。
次のミドルウェアで彼のデータを取得したい場合に備えて、現在のユーザーを保存します(「whoami」ルートなど)

Express Validatorモジュールを使用してデータを検証します。

ミドルウェア ディレクトリに、req.body プロパティを検証するために使用する追加のファイルを作成します。

ミドルウェア ディレクトリに validators というサブフォルダーを作成し、このディレクトリに userValidator.middleware.js という名前のファイルを作成します。 このファイルでは、express-validator モジュールを使用しました。これは、いくつかのプロパティをチェックしたり、プロパティが存在するかどうかを確認したり、プロパティ値が有効でない場合にユーザーへのカスタム メッセージを含むカスタム チェックを作成する必要があるときに、非常に簡単に使用できます。

ルート ディレクトリに user.route.js ファイルを作成し、これをコピー ペーストします:

上記の例は、ルートを定義する方法を示しています。 ルーターは express.Router() で作成できます。各ルートは、ビジネス ロジックを処理するミドルウェア関数をロードできます。ルーターを使用するには、ルーターをモジュールとしてエクスポートし、メイン アプリで app.use(router_module) を使用して使用します。

  • ユーザー認証と承認に Auth ミドルウェアを使用し、ルートに対するユーザー トークンまたはユーザー ロールを確認しました。このミドルウェアは、メイン ミドルウェア (ビジネス ロジックを保持するもの) の前に起動されます。次のコールバックは、次のミドルウェア メソッドに制御を渡すために呼び出されなければなりません。 ミドルウェアの関数がすべてawaitHandlerFactoryミドルウェアでラップされ、try-catchを使用してエラーを一度に処理できるようになっていることがわかります。
  • さらに、次のミドルウェアを開始する前に、createUserSchema、updateUserSchema、validateLoginスキーマでボディを検証します。
  • HTTPメソッドの構文は次のとおりです:

    コントローラを作成します。

    コントローラ ディレクトリに user.controller.js ファイルを作成し、次の内容をコピー ペーストします:

    前述のように、コントローラ ファイルには、ルートを処理するビジネス ロジックが含まれています。
    この例では、いくつかのメソッドは UserModel クラスを使用してデータを取得するためにデータベースに問い合わせます。
    各ミドルウェアでデータを返すために、res.send(result) を使用してクライアントに応答を送信します。

    そして、models ディレクトリに user.model.js ファイルを作成し、これをコピーペーストします:

    このクラスは、コントローラとデータベースとの間の接続を作成します。
    ここでは、コントローラから引数を取得し、クエリを作成し、文を準備し、db-connectionクラスからクエリメソッドを使用してデータベースに接続し、準備された文の配列でリクエストを送信し、結果を取得するすべてのメソッドがあります。
    各関数はコントローラに結果を返します。

    .gitIgnore:

    このプロジェクトをGitHubに追加する場合、.gitignoreファイルを作成してこれをコピー・ペーストすることを忘れないでください:

    node_modules.env
    Enter fullscreen mode Exit fullscreen mode

    このファイルはgitが無視すべきファイルを伝えるだけです。
    node_modules ディレクトリは重く、リポジトリに必要ないため、避けるべきでしょう。
    誰かがこのリポジトリをクローンするとき、彼らは “npm I” コマンドを使用してすべての依存関係をインストールします。
    .env ファイルを無視することは、あなたのコードを使用している他の開発者からプライベートな設定を隠すためです。

    コメントを残す

    メールアドレスが公開されることはありません。