Node.jsプロジェクトの初期化とMySQLデータベース接続の実装方法

Node.jsプロジェクトの初期化とMySQLデータベース接続の実装方法

npmパッケージマネージャーの概要

npm(Node Package Manager)はNode.js公式のパッケージ管理ツールです。当初はNode.jsの依存関係をダウンロード・管理する手段として開発されましたが、現在ではJavaScript全体で広く利用されています。

npmパッケージ検索サイト:https://www.npmjs.com/

主要なnpmコマンド:

# 単一パッケージのインストール
npm install <package-name>

# 全ての依存パッケージを表示
npm list
# 指定した依存パッケージを表示
npm list <package-name>

# 現在の依存パッケージを更新
npm update
# 指定した依存パッケージを更新
npm update <package-name>

# 現在の依存パッケージをアンインストール
npm uninstall <package-name>

VSCode環境でのNode.jsプロジェクト作成

プロジェクト作成手順:

  1. 新しいプロジェクトフォルダを作成
  2. フォルダ上で右クリックし「ターミナルで開く」を選択
  3. VSCodeの統合ターミナルで初期化コマンドを実行:
    // -yオプションでデフォルト設定を使用(カスタマイズする場合は-yを外して対話的に設定)
    npm init -y
    

上記コマンド実行後、現在のディレクトリにpackage.json設定ファイルが生成されます:

{
  "name": "sample-project",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    // カスタム実行コマンドを定義:npm run コマンド名
    // JSプロジェクトのエントリポイントは通常app.js、手動で作成が必要
    "start": "node ./app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  // MySQLインストール後の情報
  "dependencies": {
    "mysql2": "^3.6.0"
  }
}

JavaScriptからMySQLへの接続実装

MySQLドライバのプロジェクトへのインストール

VSCodeのターミナルを開き、プロジェクトルートディレクトリで以下のコマンドを実行:

# MySQL 5.x系のバージョン用
npm install mysql
# MySQL 8.x系のバージョン用
npm install @mysql/xdevapi

# installはiで短縮可能
npm i mysql
npm i @mysql/xdevapi

インストール成功後、node_modulesフォルダとpackage-lock.jsonファイルが生成されますが、通常これらを手動で編集する必要はありません。

データベース接続用モジュールの作成

再利用性を高めるため、MySQL接続専用のモジュールを作成します。

※ モジュールファイル名:dbConnector.js、utilフォルダ内に配置(utilフォルダはプロジェクトルートに存在し、node_modulesフォルダと同じ階層)

MySQLモジュールの読み込み
const mysql = require('mysql');
接続オブジェクトの取得
const dbConnection = mysql.createConnection({
  // 接続ホスト
  host: 'localhost',
  // 接続ポート
  port: 3306,
  // アカウント名
  username: 'admin',
  // パスワード
  pwd: 'password123',
  // 接続先データベース名
  dbName: 'business_db'
});
SQL実行関数のラップ処理(CRUD操作 | 検索操作)

CRUD操作(作成・削除・更新)用関数:

/**
 * @param {string} query 実行するSQL文
 * @param {...any} args 可変長引数(配列そのものは直接渡せない)
 * @returns {Promise<Object>}
 */
function performModify(query, ...args) {
  return new Promise((fulfill, deny) => {
    dbConnection.query(query, args, (err, outcome) => {
      if (err) deny({ status: false, err });
      fulfill({ status: true, modifiedCount: outcome.affectedRows });
    });
  });
}

検索操作用関数:

/**
 * @param {string} query 実行するSQL文
 * @param {...any} args 可変長引数、配列そのものは直接渡せない
 * @returns {Promise<Object>}
 */
function performFetch(query, ...args) {
  return new Promise((fulfill, deny) => {
    dbConnection.query(query, args, (err, records) => {
      if (err) deny({ status: false, err });
      fulfill({ status: true, records });
    });
  });
}
モジュールのエクスポート
// モジュールエクスポート
module.exports = {
  create: performModify,
  remove: performModify,
  modify: performModify,
  fetch: performFetch,
}

データベース接続の完全なコード例

// MySQLモジュールのインポート
const mysql = require('mysql');

// 接続オブジェクト取得
const dbConnection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  username: 'admin',
  pwd: 'password123',
  dbName: 'business_db'
});

/**
 * @param {string} query 実行するSQL文
 * @param {...any} args 可変長引数、配列そのものは直接渡せない
 * @returns {Promise<Object>}
 */
function performFetch(query, ...args) {
  return new Promise((fulfill, deny) => {
    dbConnection.query(query, args, (err, records) => {
      if (err) deny({ status: false, err });
      fulfill({ status: true, records });
    });
  });
}

/**
 * @param {string} query 実行するSQL文
 * @param {...any} args 可変長引数(配列そのものは直接渡せない)
 * @returns {Promise<Object>}
 */
function performModify(query, ...args) {
  return new Promise((fulfill, deny) => {
    dbConnection.query(query, args, (err, outcome) => {
      if (err) deny({ status: false, err });
      fulfill({ status: true, modifiedCount: outcome.affectedRows });
    });
  });
}

// モジュールエクスポート
module.exports = {
  create: performModify,
  remove: performModify,
  modify: performModify,
  fetch: performFetch,
}

接続テストコード例

// 検索SQL文定義
const searchQuery = 'SELECT * FROM departments LIMIT 20';

// 自己実行関数によるMySQL接続確認
(async function () {
  // 検索実行
  const queryResult = await mysql.fetch(searchQuery);
  // 結果出力
  console.log(queryResult);
})();

タグ: nodejs MySQL database-connection npm javascript

5月16日 16:36 投稿