Express(Nodejs)でWebAPI作成 †インストールからアプリケーション作成まで †expressインストール(グローバル) †npm install -g express expressコマンドを使用できるようにする(グローバル) †npm install -g express-generator 環境変数の設定(グローバルインストールした場合) †export NODE_PATH=/usr/local/lib/node_modules アプリケーション作成&必要なモジュールのインストール †express sample cd sample && npm install 起動確認 †起動確認用の sample.js 作成 †sample.js var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send("Hello World!!\n"); }); app.listen(3000); サンプル起動 †node sample.js サンプル確認 †curl -v http://localhost:3000 ここからは、実際にDBからデータを取得するAPIを作成する。 テスト用DBの準備(MySQL) †DB、ユーザ作成 †/* DB作成 */ CREATE DATABASE example_db DEFAULT CHARACTER SET utf8; /* ユーザ作成 */ CREATE USER 'example_user'@'%' IDENTIFIED BY 'example_pass'; /* 権限付与 */ GRANT ALL ON example_db.* TO 'example_user'@'%'; exit; 作成したユーザで接続し直してテーブル作成 †mysql -h localhost -P 3306 -u example_user -p example_db /* テーブル作成 */ CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_INCREMENT, `isbn` varchar(255) DEFAULT NULL, `title` varchar(255) DEFAULT NULL, `price` int(11) DEFAULT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /* 索引作成 */ create index books_idx1 on books (isbn); /* データ作成 */ insert into books(isbn,title,price,created_at,updated_at) values('978-4822280536', 'デッドライン', 2376, NOW(), NOW()) ,('978-4873114798', 'プログラマが知るべき97のこと', 2052, NOW(), NOW()) ,('978-4873115658', 'リーダブルコード', 2592, NOW(), NOW()) ,('978-4891004552', 'CODE COMPLETE 第2版 上 完全なプログラミングを目指して', 6588, NOW(), NOW()) ,('978-4891004569', 'CODE COMPLETE 第2版 下 完全なプログラミングを目指して', 6588, NOW(), NOW()) ,('978-4894712744', '達人プログラマー', 3456, NOW(), NOW()) ,('978-4822285241', 'ピープルウエア', 2200, NOW(), NOW()) ,('978-4621066089', '人月の神話', 3456, NOW(), NOW()); MySQLモジュールのインストール †package.json を編集 "dependencies": { "body-parser": "~1.18.2", "cookie-parser": "~1.4.3", "debug": "~2.6.9", "express": "~4.15.5", "jade": "~1.11.0", "morgan": "~1.9.0", "mysql": "*", // 追加 インストール npm install app.js を編集 †app.js var express = require('express'); . . // ## ここから追加 ## var mysql = require("mysql"); var pool = mysql.createPool({ connectionLimit : 10, host: process.env.NODE_DB_HOST || 'localhost', port: process.env.NODE_DB_PORT || '3306', user: process.env.NODE_DB_USER || 'example_user', password: process.env.NODE_DB_PASS || 'example_pass', database: process.env.NODE_DB_NAME || 'example_db' }); pool.on('connection', function (connection) { console.log("新しいコネクションプールが作成されました"); }); pool.on('acquire', function (connection) { console.log("コネクションプールから接続が獲得されました"); }); pool.on('release', function () { console.log("コネクションプールが戻されました"); }); pool.on('enqueue', function () { console.log("エンキュー"); }); global.pool = pool; // ## ここまで ## var index = require('./routes/index'); var users = require('./routes/users'); var books = require('./routes/books'); // 追加 . . app.use('/', index); app.use('/users', users); app.use('/book', books); // 追加 routes/books.js を作成 †var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { var data = []; pool.query('select * from books', function(err, rows, fields) { if (err) throw err; res.json(rows); }); }); router.get('/:id', function(req, res, next) { const id = req.params.id; pool.query('select * from books where id = ?', id, function(err, rows, fields) { res.json(rows); }); }); module.exports = router; トランザクションを張る場合 †トランザクションを張る場合は以下のように明示的に beginTransaction する必要がある。 var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { pool.getConnection(function(err, connection) { if (err) throw err; connection.beginTransaction(function(err) { connection.query('insert into xxxxx ... ', function(err, rows, fields) { if (err) { return connection.rollback(function() { connection.release(); throw err; }); } connection.commit(function(err) { connection.release(); }); res.json({"result":"true"}); }); }); }); }); 起動 †DEBUG=sample:* npm start 開発メモ †変更したときにオートリロードする †npm install -g node-dev cd myapp node-dev bin/www |