🎉

Next.jsでSequelizeを使ってWeb APIを作る方法

2020/11/30に公開

Next.jsではWeb API機能を対応しています。そのため、サーバーサイドの処理を行うことができ、DB処理もできます。

JavascirptでDBを使うとなると欠かせないのがSequelizeです。Sequelizeを使うことでMySQLやPostgresに簡単にアクセスできます。

なので、この記事では、Next.jsとSequelizeを組み合わせたWeb API機能の使い方について解説します。

API機能を作る

まず初めにデータベースを使わずに単純なjsonデータを返すWeb APIを作っていきます。

http://localhost:3000/api/helloにアクセスすると{"word":"hello"}のデータが取得できるようにします。

そのためのファーストステップがpagesフォルダーにapiフォルダーを作ることです。このpages/apiフォルダーは/api/*にマッピングされておりAPIエンドポイントとして働きます。

後は、api直下に置いたファイルに処理を記述するだけです。

export default (req, res) => {
  res.statusCode = 200
  res.json({ word: 'Hello!' })
}

export defaultで定義したメソッドが呼び出され、第1引数のreqにはリクエストに含まれる情報が入っています。そのため、以下のソースに変更してhttp://localhost:3000/api/hello?page=100でアクセスすると{page:"100"}で値を取得できます。

渡ってきたクエリパラメータはreq.query.「パラメータ名」に格納されています。

export default (req, res) => {
  res.statusCode = 200
  res.json({ page: req.query.page })
}

第2引数のresにはレスポンス情報を格納します。今回の場合だとステータスコードを200の成功レスポンスにセットし、json形式で返しています。

このように第1引数にリクエスト情報、第2引数にレスポンス情報が入っています。

Expressの設定

では次にExpressの設定を行っていきます。まずはExpressをインストールします。

npm install --save sequelize

そして、次に使用しているDBのドライバーをインストールします。それぞれに合ったドライバーをインストールしてください。

・postgres:npm install --save pg pg-hstore
・MySQL:npm install --save mysql2
・SQLite:npm install --save sqlite3

DBへのコネクション

次がDBへのコネクションの作成です。

sequelizeをインポートして、各種設定を記述します。Sequelizeをインスタンス化してコネクションを張ります。

  • 第1引数:データベース名
  • 第2引数:ユーザー名
  • 第3引数:パスワード
  • 第4引数:オプション

これらの設定を行います。第4引数のオプションではDBの製品をdialectにセットします。全て設定すると以下の通りになります。ただし、この例ではpostgresを使っているので別の製品を使っているなら書き換えが必要です。

const connection = new Sequelize(
    "db",      //DB名
    "user",      //ユーザー名
    "password",     //パスワード
    {
      dialect: "postgres"   //DBの製品名
    }
  );

モデル作成

ここからはモデルを作成していきます。テーブル定義を記述することで簡単にテーブル作成が行えるのです。ユーザーテーブルを作成しましょう。

先ほど作成したインスタンスしたSequelizedefineメソッドを利用して作成していきます。

第1引数にテーブル名を定義し、第2引数にカラム名を定義します。よく使うカラム設定は以下の通りです

  • type:カラムの型
  • primaryKey:プライマリキーの設定
  • allowNull:NULL値の許可設定、falseの場合NULLでエラーとなる
  • defaultValue:デフォルト値
  • comment:コメント

そして、defineメソッドで受け取った変数のsyncメソッドで実際にDBとモデルを同期化させます。

ここでプログラムを実行すると実際にテーブルが作られているはずです。

const User = connection.define("User", {
    userID: {
      type: DataTypes.INTEGER,
      primaryKey:true,
      comment: "ユーザーID"
    },
    userName: {
      type: DataTypes.STRING(50),
      comment: "ユーザー名",
    }
  });
  User.sync();

データ取得

それではテストデータを作成してユーザー情報を取得してみましょう。とりあえず確認のためuserID:「1」、userName:「シュウ」のデータを用意します。

そして、User変数のfindByPkを使って、プライマリキーのユーザーIDでデータを絞ります。その際の注意点は戻り値がPromise型で返却されることです。そのため、thenメソッドを使って取得した値を操作します。

ユーザー情報を取得するコードは以下の通りになります。

//ユーザー情報の取得
  User.findByPk(req.query.userID).then(function(value) {
    res.statusCode = 200
    res.json(value)
  });

まとめ

http://localhost:3000/api/get-user?userID=1のアクセス時にユーザーIDを取得してDBから値を取得する全体のソースは以下の通りになります。

import {Sequelize, DataTypes} from 'sequelize';

export default (req, res) => {
  //コネクションの作成
  const connection = new Sequelize(
    "db",     //DB名
    "user",     //ユーザー名
    "password",     //パスワード
    {
      dialect: "postgres"  //DB製品名
    }
  );
  
  //ユーザーモデルの定義
  const User = connection.define("User", {
    userID: {
      type: DataTypes.INTEGER,
      primaryKey:true,
      comment: "ユーザーID"
    },
    userName: {
      type: DataTypes.STRING(50),
      comment: "ユーザー名",
    }
  });

  //モデルとDBの同期化
  User.sync();

  //ユーザー情報の取得
  User.findByPk(req.query.userID).then(function(value) {
    res.statusCode = 200
    res.json(value)
  });
}

Discussion