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プロジェクト作成
プロジェクト作成手順:
- 新しいプロジェクトフォルダを作成
- フォルダ上で右クリックし「ターミナルで開く」を選択
- 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);
})();