■目次

書き込み用SQLクエリの基本

/**
* ${}を使って内部で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}

1. リクエストのbodyを読み取る設定をしよう(ExpressのAPI限定?)

<aside> 🌿 POSTメソッドやPUTメソッドは、リクエストを投げるときにJSON形式でbodyを渡す

bodyにデータを渡す際、ExpressのAPI側でリクエストのbodyを受け取るが、受け取ったbodyを正しく読み取ることが通常だとできない

そこで、body-parserというモジュールを使うことによってリクエストのbodyを読み取れるようにする

</aside>

  1. 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);
    

2. APIの開発【共通】

  1. app > app.jsを開き、require構文を使ってsqlite3をimportする

    ▼コード例

    /* express, appも必須!もしなければ記述しておこう! */
    const express = require("express");
    const app = express();
    **const sqlite3 = require("sqlite3");**
    
  2. 続けて、dbPathでデータベースのパスを定義する

    ▼コード例

    /** 外部import */
    const express = require("express");
    const app = express();
    const sqlite3 = require("sqlite3");
    
    /** 内部import */
    **const dbPath = "app/db/database.sqlite3";**
    
  3. さらにその下に、ポートの指定と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);**
    
  4. VSCodeのターミナルでnpm startを実行し、サーバーを立ち上げておく

3. POSTメソッドで実行するAPIの作成

  1. 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);
    

    一旦ここまで記述したら、クエリ実行用関数を作成する

SQL(DB)クエリ実行用の関数の作成

<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();
			}
		});
	});
}
  1. 先ほど作成していた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);