啜嗳1 middlewares,route,view,requestとreponseの対象

8995 ワード

ExpressはNODEJS httpモジュールに基づくネットワークサービスの枠組みであり、以下のいくつかの特徴がある.
  • .JavaScriptを開発言語として使用し、フロントエンドバックエンド言語の一致を実現する.
  • 最大の特徴:中間部品とルーティング
  • フレキシブルで、モジュール化の理念を採用するので、必要に応じてサービスを組み立てることができます.
    expressの基本概念は、express公式サイトを参照することができます.下は自分で勉強したノートです.
    一.第三者のmiddlewareライブラリ
    mogan:LOGGING MIDDLEWARE
    これはログの使用に用いられ、ユーザ操作を記録するために使用され、サービス端末応答要求requestsは時間がかかり、性能分析として使用される.
    インストール:
    npm install --save morgan
    
    使用:
    var express = require('express');
    var http = require('http');
    //    Morgan   
    var logger = require('morgan');
    
    var app = express();
    
    //   morgan   ,        
    //           ,   app.use(logger('dev'));
    app.use(logger('short'));
    
    app.use(function(req, res) {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('hello express');
    });
    
    http.createServer(app).listen(3000);
    
    //    localhost:3000
    // console   
    ::1 - GET / HTTP/1.1 200 - - 0.621 ms
    
    express.static
    これはexpress自身のパッケージの中間部品ですので、npmからインストールする必要はありません.このミドルウェアは、イメージ、CSS、HTMLファイルなどの静的リソースを送信するために使用されます.
    アプリケーションの静的リソースがpublicディレクトリの下に保存されている場合、この中間ウェアを介してファイルを送信することができる.
    var path = require('path');
    
    //   NODE  path     public   
    var publicPath = path.resolve(__dirname, 'public');
    
    //    'public'         
    app.use(express.static(publicPath));
    
    app.use(function(req, res) {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('         ');
    });
    // ...
    
    ファイルが見つからない場合は、appは次の中間部品に進みます.見つかったら、express.staticはこのファイルを送ります.中間部品のチェーン操作を停止します.
    一つの価値があるのは、開発中には、res.sendFile()を使用して静的なファイルを提供することができるが、この関数は、ファイル要求毎にファイルシステムの読み取りを要求する必要があり、アプリケーションの全体的な性能に影響を与えるため、生産環境では実行しないことである.serve-staticミドルウェアを使用することを提案します.このミドルウェアは最適化され、Expressアプリケーションのためのファイルを提供するために使用されます.もう一つのより良いオプションは、静的なファイルを逆代理で提供することです.
    その他
    とりあえずこれらの中間部品に接触して、他の中間部品は列挙するだけで、後で会ったら詳しく話します.
  • body-parser:HTTP request bodyを解析する
  • connect-ratelimit:毎時の接続数を制限し、もし誰かがサーバに大量の要求を送信するなら、この中間部品を利用してエラーを返し、サーバのあたま
  • を阻止する.
  • helmet:特定のタイプの攻撃を阻止するためにHTTP headersをアプリケーションに追加する
  • .
  • cookie-parser:解析ブラウザクッキー
  • response-time:X-Leesponse-Time headerを送信して、app性能を調整するための
  • 二.Routing
    ルートは、URLと特定のHTTP methodに基づいて、要求を特定の処理関数にマッチングさせる.
    たとえば:
    var express = require('express');
    var http = require('http');
    var path = require('path');
    
    var app = express()
    var publicPath = path.resolve(__dirname, 'public');
    app.use(express.static(publicPath));
    
    //    '/'      
    // HTTP GET   
    app.get('/', function(req, res) {
        res.end('    ');
    });
    
    
    //         '/about/:name'
    app.get('/about/:name', function(req, res) {
        res.end(`${req.params.name}  About  `)
    });
    
    //        ,   404
    //      
    app.use(function(req, res) {
        //         404
        res.statusCode = 404;
        res.end('       ')
    });
    
    http.createServer(app).listen('3000');
    
    
    app.get()を使用できるほか、app.post()など他のhttp動作を使用することもできます.
    ルートのパスマッチングには3つの方法があります.
  • 文字列
  • 文字列モード:正規表現と文字列の組み合わせの書き方です.
  • 正規表現
  • 1.最も一般的な文字列:
    app.get('/home', ...)
    app.get('/about/company', ...)
    app.get('/user/:id', ...) //     /user/1, /user/2, ....
    
    2.文字列モード
    app.get('/ab?cd', ...)   //    acd, abcd
    app.get('/ab+cd', ...)   //    abcd, abbcd, abbb...cd
    app.get('/ab(cd)?e',...) //    abe, abcde
    
    3.正規表現
    app.get(/a/, ...) //         'a'    
    app.get(/.*fly$/, ...) //     'fly'      
    
    三.request対象とレスポンス対象
    この2つのオブジェクトはExpressで拡張されています.NODEJSには属性がないものがあります.以下には、Expressの2つのオブジェクトに対する拡張属性をいくつか並べます.
    redirect([status,]path)
    reponseオブジェクトにリダイレクト方法が追加され、状態コードはデフォルトで302であり、以下のいくつかの形態がある.
    res.redirect('/foo/bar')
    res.redirect('http://example.com')
    res.redirect(301, 'http://example.com')
    res.redirect('..')
    res.redirect('back')
    
    # 1.    URL         
    res.redirect('http://google.com');
    
    # 2.  host   ,      ' http://example.com/admin/post/new'
    //          'http://example.com/admin'
    res.redirect('/admin')
    
    # 3.        ,      'http://example.com/blog/admin/'(      '/')
    //          ' http://example.com/blog/admin/post/new'
    res.redirect('post/new');
    //       'http://example.com/blog/admin'(       '/')
    //          ' http://example.com/blog/post/new'
    
    # 4.         ,      'http://example.com/admin/post/new'
    //          ' http//example.com/admin/post'
    res.redirect('..')
    
    # 5.'back'     referer;   referer   ,    '/'
    res.redirect('back')
    
    res.sendFile(path[,options][,fn]
    Express v 4.8.0バージョン以上はこの方法をサポートします.
    指定されたパスのファイルを送信するには、pathは絶対パスである必要があります.Content-Typeは、ファイルの拡張設定に従う.
    optionsの具体的なオプションは、ドキュメントのsendFile()を参照してください.fnは、request-reponse cycleを終了するか、または制御を次のrouteに渡す必要がある.
    app.get('/file/:name', function(req, res, next) {
        var options = {
            root: __dirname + '/public',
            dotfiles: 'deny',
            headers: {
                'x-timestamp': Date.now(),
                'x-send': true
            }
        };
    
        var fileName = req.params.name;
    
        res.sendFile(fileName, options, function(err) {
            if (err) {
                next(err);
            } else {
                console.log('Send: ' + fileName);
            }
        });
    });
    
    レスポンスを設定するHTTP statusは、リターン値をチェーン式で呼び出すことができます.
    res.status(403).end()
    res.status(400).send('BAD REQUEST')
    res.status(404).sendFile('/absolute/path/to/404.html')
    
    res.render(view[,local back])
    viewをレンダリングして、クライアントにレンダリングしたhtml文字列を送信します.パラメータ:
  • locars:viewのローカル変数
  • を定義するオブジェクト.
  • calback:可能なエラーとレンダリングされた文字列を返します.エラーが発生した場合、メソッド内部でnextを呼び出します.
  • view:ファイルパス文字列.絶対パスまたは相対的なview設定の相対パスとすることができる.パスにファイル拡張が含まれていない場合は、view engineの設定に従ってファイル拡張
  • が決定される.
    local variable cacheはviewをキャッシュします.trueに設定すると、開発時にキャッシュされます.製品の段階に対して、view cachingはデフォルトでtrueです.
    //      view    
    res.render('index')
    
    //       ,    html          
    res.render('index', function(err, html) {
        res.send(html);
    });
    
    //     local   view
    res.render('user', { name: 'Tobi' }, function(err, html) {
        // ...
    })
    
    req.get(field)
    新規要求の方法は、特定のHTTP request headerフィールドに戻る(大文字と小文字を区別しない).
    req.get('Content-Type') // 'text/plain'
    req.get('something')    // undefined
    
    req.ip
    要求されたipアドレスを返します.
    var EVIL_IP = '123.45.67.89';
    app.use(function(req, res, next) {
        if (req.ip === EVIL_IP) {
            res.status(401).send('   ip  ');
        } else {
            next();
        }
    });
    // ...
    
    四.Views
    expressのビューは、EJS(Embodd JavaScript)、Pug、Handlebarsなどの様々なモデルを使用してレンダリングすることができます.
    ビューを設定します.
    //            views
    app.set('views', path.resolve(__dirname, "views"))
    
    //         
    //            npm install --save ejs
    app.set('view engine', 'ejs')
    
    五.例
    以下は伝言本の小さいページです.
    // app.js
    
    var express = require('express');
    var http = require('http');
    var path = require('path');
    var logger = require('morgan');
    var bodyParser = require('body-parser');
    
    var app = express();
    
    //             
    app.set('views', path.resolve(__dirname, 'views'));
    app.set('view engine', 'ejs');
    
    var entries = [];
    app.locals.entries = entries; //  entries    views    
    
    app.use(logger('dev'));
    
    //         。     req.body   
    // extended       
    app.use(bodyParser.urlencoded({ extended: false }));
    
    //      ,   views/index.ejs
    app.get('/', function(req, res) {
        res.render('index');
    });
    
    app.get('/new-entry', function(req, res) {
        res.render('new-entry');
    });
    
    //        '/new-entry'    POST   
    app.post('/new-entry', function(req, res) {
        //         title body,   400  
        if (!req.body.title || !req.body.body) {
            res.status(400).send('Entries must have a title and body');
            return;
        }
        entries.push({
            title: req.body.title,
            content: req.body.body,
            published: new Date()
        });
        //           entry
        res.redirect('/');
    });
    
    // 404 page
    app.use(function(req, res) {
        res.status(400).render('404');
    });
    
    
    http.createServer(app).listen('8888');
    
    具体的なコードはexpress-gust book githubです.
    締め括りをつける
    この章は主にExpressの具体的な操作と一部のAPIの紹介です.Expressの2つの特徴を簡単に話しました.middleware、route.また、ビューも使用して、どのようにモデルエンジンを介してレンダリングされます.