presen-expressjs



presen-expressjs

0 0


presen-expressjs


On Github watanany / presen-expressjs

Express

Node.js勉強会予定

JavaScript Node.jsの概要 Node.jsの実例紹介 Express Socket.IO MongoDB Template Engine

Expressとは?

Webアプリを作るための最小かつ柔軟なフレームワーク

堅牢なAPIを

素早く

簡単に作成できる

Expressの機能

  • URLディスパッチャ
  • テンプレートエンジン
  • セッション管理機能
  • エラーハンドリング
  • 静的ファイルの配信

ある日・・・

( ゚Д゚) 「今日は」 ( ゚Д゚) 「なんだかNode.jsでアプリを作りたい気分だ」 ( ゚Д゚) 「・・・」 ( ゚Д゚) 「Hello Worldとかやってみるか」

Hello Worldサンプル

Node.jsのみのコード

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World!\n');
}).listen(3000);
( ゚Д゚) 「よしできた!」 ( ゚Д゚) 「けど、1ページしかないのもつまらないな」 ( ゚Д゚) 「WEBサービスってページいっぱいあるもんだし」 ( ゚Д゚) (Amebl○とかニ○ニコ動画もページいっぱいあるし)
(;゚Д゚) 「あれ、Node.jsって・・・」 (;゚Д゚) 「ルーティング機能ないのか?」 ( ゚Д゚)~♪ 「まぁなんとかなるか」

作成中

バンバンバンバンバンバンバン
バン     バンバンバン
バン (∩`・ω・) バンバン
 _/_ミつ/ ̄ ̄ ̄/
   \/___/ ̄ ̄

Node.jsのみでのルーティング

server.on("request", function(req, res) {
    res.writeHead(200);
    if (req.url === "/") {
        res.write("Hello World!")
    }
    else if (req.url === "/test") {
        res.write("レスポンスしてみるテスト")
    }
    else {
        res.write("404 NOT FOUND");
    }
    // レスポンスを終了する
    res.end();
});

server.listen(setting.PORT, setting.IP, setting.startServer);
( ゚Д゚) 「できたけど、ページ数増えたら」 (;゚Д゚) 「if文の量がすごいことになりそう・・・」 (;゚Д゚) 「テンプレートエンジンとかもどうするんだろ」 ( ゚Д゚) ( ゚Д゚) 「HTMLにデータ埋め込みたいんだけど・・・」
( ゚Д゚) 「・・・」 ( ゚Д゚) 「・・・」 ( ゚Д゚) 「・・・」

(ノ ゚д゚)ノ 彡┻━┻

ソォイ!!

Express

ExpressによるHello World

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send('Hello World!');
});

app.listen(3000);

Expressによるルーティング

app.get("/", function(req, res, next) {
    res.send("Hello World!")
});

app.get("/test", function(req, res, next) {
    res.send("レスポンスしてみるテスト");
});

app.use(function(req, res, next) {
    err = new Error("404 NOT FOUND");
    err.status = 404;
    next(err);
});

Expressとテンプレートエンジン

app.get("/", function(req, res, next) {
    res.render("index", { title: "Express" });
});
doctype html
html
    head
        title= title
    body
        p About Template Engine

express-generator

1. express myapp
2. cd myapp && npm install
3. npm start

Node.jsの処理の流れ

リクエスト URLに応じた処理 エラー処理 レスポンス

Middleware

ミドルウェアの役割

リクエスト (ミドルウェア処理) URLに応じた処理 (ミドルウェア処理) エラー処理 (ミドルウェア処理) レスポンス

ミドルウェア

function myMiddleware(req, res, next) {
  console.log(req.baseUrl + req.path);
  next();  // 次のミドルウェアに移動する
}

ミドルウェアを実際に使う

var express = require('express');
var app = require('express');

app.use(myMiddleware);

特定のパスにマウントする

app.use('/test', function(req, res, next) {
  console.log(req.baseUrl + req.path);
});

Middleware

Middleware 効果 static 静的ファイルを配信する serve-favicon faviconを配信する morgan HTTPリクエストのログを出力する cookie-parser クッキー文字列を解析する body-parser HTTPリクエストを解析する

Middleware

Middleware 効果 express-session セッション機能を提供する express-debug HTMLにデバッグ情報を出力する compression レスポンス圧縮する機能を提供する csurf CSRF対策 passport 認証機能を提供する less-middleware LessをCSSに変換する coffee-middleware JavaScriptをCoffeeScriptに変換する

ROUTING

ルーター

// routes/user.js

var express = require('express');
router = express.Router();

router.get('/edit', function(req, res, next) {
  console.log(req.baseUrl + req.path);
});

module.exports = router;

ルーターをマウントする

// app.js

var express = require('express');
var app = express();
var users = require('routes/user');

app.use('/users', users);

Error Handling

エラーハンドラー

function myErrorHandler(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send("エラー");
}

エラーハンドラーをマウントする

app.use(function(req, res, next) {
  next(new Error('入力がおかしいです');
});

app.use(myErrorHandler);

Express && Socket.IO

app.js

express = require('express');
app = express();
app.io = require('socket.io')()

// ...

app.io.on('connection', function(socket) {
  // Socket.IOを使った処理
});

module.exports = app

bin/www

var app = require('../app');
var debug = require('debug')('minimal:server');
var http = require('http');

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

var server = http.createServer(app);

app.io.attach(server);    // [Socket.IOをサーバーにアタッチする!]

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

その他

  • ORM

    • Sequelize
  • プロセスマネージャー

    • クラッシュした時に自動再起動
    • パフォーマンスとリソース管理
    • セッティングを動的に変更
    • StrongLoop
    • PM2
    • Forever

StrongLoop Process Manager

  • パッケージビルド
  • デプロイ
  • CPU、ヒープの状態を見れる
    • パフォーマンスの最適化
    • メモリリークの診断
  • プロセスを永続化する
  • Nginxの下でのマルチホスティング・デプロイ
  • PM2、Foreverと違って総合的なランタイム環境・デプロイを提供する

http://expressjs.com/advanced/pm.html

付録

ワッショイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワッショイ

その他のフレームワーク

  • Koa
  • LoopBack

Node.js v4 - Argon

Node.jsのLTS版のv4.x.xが出ました!

(ちなみにアルゴンはギリシャ語由来で「怠惰な」「不活発な」という意味だそうです)
Express