Node.js学習ノート(六)expressモジュール

9459 ワード

ExpressはWebアプリケーションのフレームワークであり、Webアプリケーションを迅速に構築するのに役立ちます.
1、Hello World
まず簡単な小型アプリケーションを構築し、Expressの基本的な使用方法を熟知します.
  • まず、プロジェクトのルートディレクトリとして新しいフォルダを作成し、そのフォルダの下でコマンドライン
  • を開く.
  • は、その後、npm initコマンドを使用して、プロジェクトのプロファイル
  • であるpackage.jsonファイルを生成する.
  • は、npm install --save expressコマンドを使用してExpressをインストールし、node_modulesディレクトリの下に
  • が配置されます.
  • は最後にserver.jsファイルを作成し、このファイルには次のコードを記述する:
  • //    Express   
    var express = require('express')
    //    Express   
    var app = express()
    //     
    app.get('/', function (req, res) {
        res.send('Hello World')
    })
    //      ,     5000
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })

    上は簡単なアプリですが、文法を理解する必要はありません.後で一つ一つ説明します.
    最後にコマンドラインを開き、コマンドnode server.jsを入力して開きます.http://127.0.0.1:5000/ハローワールドの挨拶が見えます
    2、基礎ルートの設定
    ルーティングは、アプリケーションが特定のクライアントリクエストにどのように応答するかを決定します.
    各ルーティングには、ルーティングマッチング時に実行される1つ以上の処理関数があり、構文フォーマットは次のとおりです.
    app.METHOD(PATH, HANDLER)

    ここで、METHODはリクエストメソッドを表し、PATHはマッチングパスを表し、HANDLERはルーティングマッチング時の処理ロジックを表す
    以下のコードを例にとると、クライアントがGETメソッドでルートパスリソースを要求すると、匿名関数を実行し、Hello World応答を送信する
    app.get('/', function (req, res) {
        res.send('Hello World')
    })

    (1)METHOD
    METHODは要求方法を定義し、ExpressはすべてのHTTP要求方法をサポートし、以下にいくつかの例を示す.
  • app.get(PATH, HANDLER)は、GETメソッドを使用してPATHパス上のリソースを要求するときに実行する論理HANDLER
  • を定義する.
  • app.post(PATH, HANDLER)は、POSTメソッドを使用してPATHパス上のリソースを要求するときに実行する論理HANDLER
  • を定義する.
  • app.all(PATH, HANDLER)は、任意の方法でPATHパス上のリソースを要求するときに実行する論理HANDLER
  • を定義する.
    (2)PATH
    PATHは、文字列、文字列モード、または正規表現とすることができる一致パスを定義します.以下に例を示します.
  • '/about'マッチング要求経路/about
  • '/ab?cd'マッチング要求パス/acd、/abcd(?:マッチング前の文字0回または1回)
  • '/ab+cd'マッチング要求経路/abcd,/abbcd等(+:マッチング+前の文字1回または複数回)
  • /a/は、任意の文字aを含む要求経路(正規表現を使用してほとんどすべての複雑なニーズを満たすことができる)
  • に一致する.
    また、指定された位置の値をキャプチャし、:に保存するパラメータをパスに指定することもできます.
    var express = require('express')
    var app = express()
    app.get('/', function (req, res) {
        res.send('Hello World')
    })
    app.get('/firstname/:firstname/lastname/:lastname', function (req, res) {
        let params = req.params
        let result = params.firstname + ' ' + params.lastname
        res.send(result)
    })
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
    
    /*
     *     :
     *        http://127.0.0.1:5000
     *        Hello World
     *        http://127.0.0.1:5000/firstname/Steve/lastname/Jobs
     *        Steve Jobs
    **/

    (3)HANDLER
    HANDLERは、ルーティングマッチング時の処理ロジックであり、関数、関数配列、または両方の組合せ形式であってもよい
    複数の関数のセットを使用する場合は、req.paramsメソッドを使用して後続の関数に制御権を渡す必要があります.そうしないと、直接終了します.
    var express = require('express')
    var app = express()
    var sayHello = function (req, res) {
        res.send('Hello World')
    }
    var reverseMessage = function(req, res) {
        let message = req.params.message
        let reverse = message.split('').reverse().join('')
        res.send(reverse)
    }
    var showParams = function (req, res, next) {
        let params = req.params
        console.log('---Params')
        for (let prop in params) {
            console.log(prop + ': ' + params[prop])
        }
        console.log('---------')
        next()
    }
    app.get('/', sayHello)
    app.get('/reverse/:message', [showParams, reverseMessage])
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })

    一般的に、関数にはRequestオブジェクトとResponseオブジェクトの2つのパラメータがあり、要求と応答データの処理に使用されます.
    Requestオブジェクトの一般的なプロパティとメソッドは、次のとおりです.
    属性とメソッド
    説明
    ip
    IPアドレス
    originalUrl
    元のURL
    baseURL
    ベースURL
    protocol
    プロトコルのタイプ
    hostname
    ホスト名
    subdomains
    サブドメイン名
    path
    リソースパス
    query
    クエリー文字列
    route
    現在の一致ルーティング
    params
    GETリクエストのコンテンツを取得するためのルーティングパラメータ
    body next()ミドルウェアを使用する場合、POSTデータを取得するための要求主体を含む
    cookies body-parserミドルウェアを使用する場合、Cookieコンテンツを取得するためのCookieオブジェクトが含まれるcookie-parser
    指定したHTTPリクエストヘッダを取得する
    Responseオブジェクトの一般的なプロパティと方法は、次のとおりです.
    属性とメソッド
    説明get(field)
    HTTP応答ヘッダの設定set(field[,value])
    HTTP応答ヘッダに戻るget(field)
    HTTP応答ヘッダの追加append(field[,value])
    Cookieの設定cookie(name,value[,option])
    CookieをクリアclearCookie(name[,options])
    指定したパスにリダイレクトredirect([status,]path)
    レスポンスの転送send([body])
    トランスファステータスコードsendStatus(code)
    ファイルの転送sendFile(path[,options][,fn])
    JSONデータ転送json([body])
    JSONPデータの転送jsonp([body])
    応答の終了
    3、高級ルート設定
    (1) end([data][,encoding])
    同じパスの異なるリクエストメソッドに対して異なる処理関数を定義する必要がある場合は、app.route()が良い選択です.
    app.route('/book')
        .get(function (req, res) {
            res.send('Get a book')
        })
        .post(function (req, res) {
            res.send('Add a book')
        })
        .put(function (req, res) {
            res.send('Update the book')
        })

    (2) app.route(path) express.Router()は、expressのインスタンスと同様にルーティングおよびミドルウェアを追加できるRouterインスタンスを作成するために使用されます.
    ルーティングファイルexpress.Router([options])を作成し、ファイルに次のコードを記述できます.
    var express = require('express')
    var router = express.Router()
    //      
    router.use((req, res, next) => {
      console.log('    : ' + Date.now())
      next()
    })
    //     
    router.get('/', (req, res, next) => {
        res.send('Home Page')
    })
    router.get('/about', (req, res, next) => {
        res.send('About Page')
    })
    module.exports = router

    次に、アプリケーションrouter.jsにルーティングファイルをロードできます.コードは次のとおりです.
    var express = require('express')
    var router = require('./router')
    var app = express()
    app.use('/router', router)
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })

    4、ミドルウェア関数
    ミドルウェア(Middleware)は実際には、リクエストオブジェクトRequest、レスポンスオブジェクトResponse、next関数にアクセスできる関数です.
    ミドルウェアのロード順序は非常に重要で、先にロードされたミドルウェアは先に実行され、ミドルウェアは以下のいくつかのカテゴリに分けることができる.
  • アプリケーション・レベルのミドルウェア:server.jsメソッドおよびapp.METHOD()メソッドによってexpressインスタンス
  • にバインドされます.
    var express = require('express')
    var app = express()
    //         ,                
    app.use(function (req, res, next) { //      
        console.log('Time: ' + Date.now())
        next()
    })
    app.get('/user/:id', function (req, res, next) { //      
        res.send('Hello, ' + req.params.id)
    })
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
  • ルータレベルミドルウェア:app.use()メソッドとrouter.METHOD()メソッドによってRouterインスタンスにバインドされます.アプリケーションレベルミドルウェアと同じ
  • で動作します.
    var express = require('express')
    var router = express.Router()
    router.use(function (req, res, next) { //      
        console.log('Time: ' + Date.now())
        next()
    })
    router.get('/user', function (req, res) {  //      
        res.send('Hello, ' + req.params.id)
    })
    var app = express()
    app.use('/virtual', router)
    var server = app.listen(5000, '127.0.0.1', function() {
        console.log('server running at http://127.0.0.1:5000')
    })
  • エラー処理ミドルウェア:アプリケーションレベルミドルウェアとルータレベルミドルウェアの定義と同じ違いは、エラー処理ミドルウェアのパラメータが4つあり、それぞれrouter.use()
  • である.
    app.use(function(err, req, res, next) {
        console.error(err.stack)
        res.status(500).send('Error!')
    })
  • 内蔵ミドルウェア:一般的な内蔵ミドルウェアはfunction(err, req, res, next)であり、以下では
  • について説明する.
  • サードパーティミドルウェア:一般的なサードパーティミドルウェアは、公式ドキュメント
  • を参照できます.
    5、静的ファイル
    Expressに内蔵されたミドルウェア関数express.static()は、画像、CSS、JSなどの静的ファイルをマウントできます.構文フォーマットは次のとおりです.
    express.static(root, [options])

    ここでrootは静的ファイルを格納するルートディレクトリパスを表し、optionsはより詳細な情報を提供するオブジェクトです.express.static()ディレクトリは静的ファイルを格納するために使用され、publicファイルはプログラムのメインエントリであり、ディレクトリ構造は以下の通りである.
    + app
      + node_module
      + public
        + images
          - icon.png
          - background.png
        - index.html
        - style.css
        - script.js
      - server.js
      - package.json
    server.jsファイルにserver.jsディレクトリの下のコンテンツがオープンであることを宣言することで、クライアントはアドレスを通じてリソースを直接要求することができます.
    たとえばhttp://127.0.0.1:5000/images/icon.png、http://127.0.0.1:5000/hello.htmlなど
    app.use(express.static('public'))

    仮想パス接頭辞を作成する必要がある場合は、マウント時に指定できます.これにより、クライアントは既存のパスの前に仮想接頭辞を追加してリソースにアクセスする必要があります.
    たとえばhttp://127.0.0.1:5000/static/images/icon.png、http://127.0.0.1:5000/static/hello.htmlなど
    app.use('/static', express.static('public'))

    【ノード.jsシリーズの詳細は、ノード.js学習ノートを参照してください】