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 する必要がある。
※常にトランザクションを張る場合は、pool あたりをラップすれば、上記のコードと殆ど変わらないコード量にはできそう。

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

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-02 (木) 03:15:12 (2657d)