■目次
/**
* ${}を使って内部でjsを記述する際は、全体をテンプレートリテラルにすること
*/
/** 新規作成(POST) */
INSERT INTO テーブル名 (作成したいカラム名) VALUES (値)
// 例
INSERT INTO users (name, profile) VALUES ("${name}", "${profile}")
/** 更新(PUT) */
UPDATE テーブル名 SET 該当カラム名=値 WHERE id=該当id
// 例
UPDATE users SET name="${name}", profile="${profile}" WHERE id=${id}
/** 削除(DELETE) */
DELETE FROM テーブル名 WHERE id=該当id
// 例
DELETE FROM users WHERE id=${id}
<aside> 🌿 POSTメソッドやPUTメソッドは、リクエストを投げるときにJSON形式でbodyを渡す
bodyにデータを渡す際、ExpressのAPI側でリクエストのbodyを受け取るが、受け取ったbodyを正しく読み取ることが通常だとできない
そこで、body-parserというモジュールを使うことによってリクエストのbodyを読み取れるようにする
</aside>
app > app.jsを開き、以下を記述する
/** 外部import */
const express = require("express"); // 記述済みなら飛ばしてOK
const app = express(); // 記述済みなら飛ばしてOK
const bodyParser = require("body-parser");
/** リクエストのbodyをパースする設定 */
// Configure body-parser to get values from input form
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
▼記述例
/** 外部import */
**const express = require("express");
const app = express();**
const sqlite3 = require("sqlite3");
const path = require("path");
**const bodyParser = require("body-parser");**
/** 内部import */
const dbPath = "app/db/database.sqlite3";
**/** リクエストのbodyをパースする設定 */
// Configure body-parser to get values from input form
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());**
/** web server */
// publicディレクトリを静的ファイル群のルートディレクトリとして設定
app.use(express.static(path.join(__dirname, "public")));
/** API */
// Get all users
app.get("/api/v1/users", (req, res) => {
// Connect database
const db = new sqlite3.Database(dbPath);
db.all("SELECT * FROM users", (err, rows) => {
res.json(rows);
});
db.close();
});
// Get a user
app.get("/api/v1/users/:id", (req, res) => {
// Connect database
const db = new sqlite3.Database(dbPath);
// :idに入ってきた値をidに格納
const id = req.params.id;
// SQLはテンプレートリテラルで記述する
db.get(`SELECT * FROM users WHERE id = ${id}`, (err, row) => {
res.json(row);
});
db.close();
});
// Search users matching keyword
app.get("/api/v1/search", (req, res) => {
// Connect database
const db = new sqlite3.Database(dbPath);
// queryパラメータに入ってきた値をkeywordに格納
const keyword = req.query.q;
// "%${keyword}%":keywordに部分一致するものが全て取得される。文字列なので""で囲っている
db.all(`SELECT * FROM users WHERE name LIKE "%${keyword}%"`, (err, rows) => {
res.json(rows);
});
db.close();
});
/** server */
// process.env.PORT:ローカルの環境変数(PORT)を参照する
// process.env.PORTが指定されていればそれを、なければ3000番を指定する
const port = process.env.PORT || 3000;
// 通常であれば、3000番台でアプリケーションを立ち上げる
app.listen(port);
// サーバーが立ち上がったかを確認する
console.log("Listen on port: " + port);
app > app.jsを開き、require構文を使ってsqlite3をimportする
▼コード例
/* express, appも必須!もしなければ記述しておこう! */
const express = require("express");
const app = express();
**const sqlite3 = require("sqlite3");**
続けて、dbPathでデータベースのパスを定義する
▼コード例
/** 外部import */
const express = require("express");
const app = express();
const sqlite3 = require("sqlite3");
/** 内部import */
**const dbPath = "app/db/database.sqlite3";**
さらにその下に、ポートの指定とAPIサーバーの立ち上げに必要なコードを記述する
▼コード例
/** 外部import */
const express = require("express");
const app = express();
const sqlite3 = require("sqlite3");
/** 内部import */
const dbPath = "app/db/database.sqlite3";
/* 後ほど、ここにAPIを記述する */
****// process.env.PORT:ローカルの環境変数(PORT)を参照する
// process.env.PORTが指定されていればそれを、なければ3000番を指定する
**const port = process.env.PORT || 3000;**
// 通常であれば、3000番台でアプリケーションを立ち上げる
**app.listen(port);**
// サーバーが立ち上がったかを確認する
**console.log("Listen on port: " + port);**
VSCodeのターミナルでnpm startを実行し、サーバーを立ち上げておく
app > app.jsを開き、POSTメソッドを実行するAPIを記述する
※ここでは正常の場合のみ記述する。エラー時については別記事にまとめる
<aside> 🌿 今回の場合、ID, created_at, updated_atの3つは自動生成されるよう設定したため、リクエストのbodyにセットしなくてOK
</aside>
▼コード例
/** 外部import */
const express = require("express");
const app = express();
const sqlite3 = require("sqlite3");
const path = require("path");
const bodyParser = require("body-parser");
/** 内部import */
const dbPath = "app/db/database.sqlite3";
/** リクエストのbodyをパースする設定 */
// Configure body-parser to get values from input form
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
/** web server */
// publicディレクトリを静的ファイル群のルートディレクトリとして設定
app.use(express.static(path.join(__dirname, "public")));
/** API */
〜〜〜
**// Create a new user
app.post("/api/v1/users", (req, res) => {
// Connect database
const db = new sqlite3.Database(dbPath);
// リクエストのbodyで受け取った値を定数に格納
const name = req.body.name;
// profileと誕生日は任意入力のため、空欄も想定
const profile = req.body.profile ? req.body.profile : "";
const dateOfBirth = req.body.date_of_birth ? req.body.date_of_birth : "";
});**
/** server */
// process.env.PORT:ローカルの環境変数(PORT)を参照する
// process.env.PORTが指定されていればそれを、なければ3000番を指定する
const port = process.env.PORT || 3000;
// 通常であれば、3000番台でアプリケーションを立ち上げる
app.listen(port);
// サーバーが立ち上がったかを確認する
console.log("Listen on port: " + port);
一旦ここまで記述したら、クエリ実行用関数を作成する
<aside> 🌿 SQLにクエリを投げたいため、そのための関数を作成する
</aside>
▼基本の書き方
const run = async (sql) => {
return **new Promise((resolve, reject)** => { // Promiseを返す = resolve()かreject()まで完了を待つ
db.run(sql, (err) => { // db.run():sqlite3のメソッド
if (err) {
**res.status(500).send(err);** // SQL実行失敗 → サーバーエラー
return reject();
} else {
res.json({ message: "新規ユーザーを作成しました!" });
return resolve();
}
});
});
}
先ほど作成していたPOSTメソッドを実行するAPIの中に、上記コードを記述する
▼コード例
/** 外部import */
const express = require("express");
const app = express();
const sqlite3 = require("sqlite3");
const path = require("path");
const bodyParser = require("body-parser");
/** 内部import */
const dbPath = "app/db/database.sqlite3";
/** リクエストのbodyをパースする設定 */
// Configure body-parser to get values from input form
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
/** web server */
// publicディレクトリを静的ファイル群のルートディレクトリとして設定
app.use(express.static(path.join(__dirname, "public")));
/** API */
〜〜〜
// Create a new user
app.post("/api/v1/users", (req, res) => {
// Connect database
const db = new sqlite3.Database(dbPath);
// リクエストのbodyで受け取った値を定数に格納
const name = req.body.name;
// profileと誕生日は任意入力のため、空欄も想定
const profile = req.body.profile ? req.body.profile : "";
const dateOfBirth = req.body.date_of_birth ? req.body.date_of_birth : "";
**const run = async (sql) => {
return new Promise((resolve, reject) => {
db.run(sql, (err) => {
if (err) {
res.status(500).send(err);
return reject();
} else {
res.json({ message: "新規ユーザーを作成しました!" });
return resolve();
}
});
});
};**
});
****
/** server */
// process.env.PORT:ローカルの環境変数(PORT)を参照する
// process.env.PORTが指定されていればそれを、なければ3000番を指定する
const port = process.env.PORT || 3000;
// 通常であれば、3000番台でアプリケーションを立ち上げる
app.listen(port);
// サーバーが立ち上がったかを確認する
console.log("Listen on port: " + port);