大量の処理をさばくために、ノンブロッキングI/Oというモデルを採用したプログラミング言語。
今回は「nodejs」 の最小構成を構築して行きたいと思います。
nodejsとは
サーバサイドjavascript。
googleが開発したV8エンジン上で動作する言語。
expressとは
Node.js 向けの高速で最小限の Web フレームワーク。
sequelizeとは
Noje.js向けのORM。PostgreSQL, MySQL, SQLite , MSSQL等をサポート。
環境とIDE
mac osx 10.9.5
mysql 5.6.31
eclipse neon + nodeclipse
nodejsインストール
homebrewでnodejsをインストールします。
npmというnodejsのパッケージ管理ツールも同時にインストールされます。
$ brew install node
express-generatorインストール
express-generatorはexpressのスケルトン(フレームワークの雛形)を作成するためのモジュールです。
$ npm install express-generator -g
expressスケルトン作成
$ express node_base
フォルダ構成は下記のようになります
node_base(workfolder)
├─app.js
├─package.json
├─public
│ ├─images
│ ├─javascripts
│ └─stylesheets
│ └─style.css
├─routes
│ ├─index.js
│ └─users.js
├─bin
│ └─www
└─views
├─error.jade
├─layout.jade
└─index.jade
sequelizeインストール
まずはnode_base内のpackage.jsonを修正します。
package.jsonはnpmでの依存関係等をまとめているjsonファイルです。
dependenciesに追加するモジュール。
"mysql": "~2.11.1",
"sequelize": "~3.23.6",
{
"name": "node_base",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.15.1",
"cookie-parser": "~1.4.3",
"debug": "~2.2.0",
"express": "~4.13.4",
"jade": "~1.11.0",
"morgan": "~1.7.0",
"serve-favicon": "~2.3.0",
"mysql": "~2.11.1",
"sequelize": "~3.23.6"
}
}
npm install
追加したモジュールをインストールします。
$ pwd
path/to/workspace/node_base
$ npm install
sequelize-cliインストール
sequelize-cliはSequelizeコマンドラインインタフェースです。
色々便利なのでインストールしておきます
$ npm install -g sequelize-cli
DB作成 & db migration実行
まずは、sequelizeの環境を作るため初期化します。
$ sequelize init
node_baseフォルダ内に下記のフォルダが作成されます。
node_base(workfolder)
├─config
│ └─config.json # DB周りの設定情報が記載
├─migrations # sequelize-cliでmigrationファイルを作成した際に格納されるフォルダ
├─seeders
└─models # sequelize-cliでmodelを作成した際に格納されるフォルダ
作成したmodelに対応したDBのテーブルをmigrationするためにmysqlにDBを作成します。
流し込まれるDBの情報はconfig/config.json
内に記載されています。
{
"development": {
"username": "root",
"password": null,
"database": "node_base",
"host": "127.0.0.1",
"dialect": "mysql"
},
"test": {
"username": "root",
"password": null,
"database": "node_base_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "node_base",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
config.jsonには各環境毎にDB設定情報が記載されています。
SQLファイル作成 & 流し込み
SQLファイルを作成します。
CREATE DATABASE node_base;
DBに流し込みます。
$ mysql -u root < config/db.sql
model & migration作成
sequelize-cliでmodelやdb周りを作成して行きます。
model作成
Userモデルを作成します。
下記のコマンドを実行するとmodelsフォルダ内にuser.jsが作られmigrationsフォルダにmodelのcreate用のmigrationファイルが作成されます。
$ sequelize model:create --name User --attributes name:string
migration作成
上記で既にUser modelのmigrationファイルが作成されていますが、ここでmigrationファイルを作成します。db:migrateを実行する時下記のコマンドでmigrationを作成していないと実行できなかったため、おそらく必要なんだと思います。
$ sequelize migration:create
db migration実行
$ sequelize db:migrate
上記のコマンドが完了するとDB内に先ほど作成したUserのテーブルが作成されます。
userAPI作成
express-generatorでスケルトンを作ると既にuserAPIが作成されているのでそちらをいじってuserのidとnameを渡したらUsersテーブルにデータを作成 or 検索を行うようなAPIを作ります。
var express = require('express');
var models = require("../models");
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
var user_id = req.query.user_id;
var name = req.query.name;
models.User.findOrCreate(
{"where": {"id": user_id},
"defaults": {"id": user_id, "name": name}}
).spread(function(user, created){
res.send({"user": user, "created": created});
});
});
module.exports = router;
サーバ起動 & APIテスト
サーバ起動を起動してAPIの確認をしてみます。
$ npm start
http://127.0.0.1:3000/users/?user_id=1&name=test
こちらにアクセスすると
github
上記対応を行ったソースコードをgithubにあげているので、興味がある方はcloneしてみて下さい。
https://github.com/yu-sa/node_base
# まとめ
- defacto standardなモジュール等が充実しており、簡単なwebサーバはすぐ作れるようです。
- ノンブロッキングI/Oモデルを採用している事により、処理を非同期で実行しレスポンスを速やかに返す頃が出来るため、設計等をしっかりと行えば高速なwebサーバを作成する事が出来そうで、作っていて面白そうな言語であると感じました。