Next.jsでSequelizeを使ってWeb APIを作る方法
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の製品名
}
);
モデル作成
ここからはモデルを作成していきます。テーブル定義を記述することで簡単にテーブル作成が行えるのです。ユーザーテーブルを作成しましょう。
先ほど作成したインスタンスしたSequelize
のdefine
メソッドを利用して作成していきます。
第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