[Node.js] Express


Express


ExpressはNodeです.これは、jsの開発をより迅速に行うためのWebフレームワークです.
expressを使用せず、HTTP内蔵モジュールのみを使用してWebサーバを作成します.
const http = require('http');

http.createServer((request, respone) => {
	response.writeHead(200, {'Content-Type' : 'text/html'});
  	response.write('Hello !')
  	response.end()
}).listen(8000)
こうなります.
ただし、expressを使用すると、コードがより簡潔になります.
const express = require('express');
const app = express;
app.length('/', (req, res) => {
	res.send('Hello!')
})
app.listen(port)
コードがこんなに簡潔なのは、Expressが所有するミドルウェアとルータのためです.
ミドルウェアとルータを見てみましょう.

1.ミドルウェアとは?



正式なドキュメントでは、要求オブジェクト、応答オブジェクト、およびアプリケーション要求-応答ライフサイクルの次のミドルウェア関数をアクセス権のある関数として定義します.
ミドルウェアは、サーバが受信要求と送信応答の間で何らかの操作を実行するプログラムである.(2つのHTTPパケット転送間で発生した事象を実行)
次の操作を行います.
  • すべてのコード
  • を実行
  • リクエストおよびレスポンスオブジェクトに対する変更
  • を実行する.
  • 要求終了応答期間
  • 呼び出し
  • スタックの次のミドルウェア関数
  • ミドルウェア使用時

  • A.すべてのリクエストのurlまたはメソッドを表示する場合、
  • const express = require('express');
    const app = express();
    
    const myLogger = function (req, res, next) {
      next(); // 다음 미들웨어를 실행, 미들웨어를 통해 데이터를 전달합니다.
    };
    app.use(myLogger);
    app.get('/', function (req, res) {
      res.send('Hello World!');
    });
    
    app.listen(3000);
  • B.POST要求のようなインクルード(負荷)を構築する場合、
  • .
    expressを使用しない場合、bodyを得るために、
    let body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      // body 변수에는 문자열 형태로 payload가 담겨져 있습니다.
    });
    私はこのような形で受け取るべきです.
    しかし、body-parserミドルウェアは、このプロセスを簡略化することができる.
    const bodyparser = require('body-parser')
    const jsonparser = bodyParser.json()
    
    app.post('/api/users', jsonparser, function(req, res) {})
  • C.すべての要求/応答にCORSヘッダを付けなければならない.
    expressを無効にする場合は、各タイトルを再定義し、OPTIONSメソッドのルーティングを実施する必要があります.
  • const defaultCorsHeader = {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
      'Access-Control-Allow-Headers': 'Content-Type, Accept',
      'Access-Control-Max-Age': 10
    };
    
    if (req.method === 'OPTIONS') {
      res.writeHead(201, defaultCorsHeader);
      res.end()
    }
    Corsモジュールは操作を簡略化した.
    
    const cors = require('cors')
    
    app.get('/products/:id', cors(), function (req, res, next) {
      res.json({msg: 'This is CORS-enabled for a Single Route'})
    })
  • D.認証要求ヘッダにユーザ認証情報が含まれているかどうか.
    トークン:
  • 、ユーザー認証用
    app.use((req, res, next) => {
        if(req.headers.token){ //token이 있는지 없는 지 확인
        req.isLoggedIn = true;
        next()
      } else {
        res.status(400).send('invalid user')
      }
    })

    use() , next()


    ミドルウェアを登録する場合はuse()メソッドを使用して登録でき、複数のミドルウェアが登録されている場合はnext()メソッドを呼び出して次のミドルウェアに渡して処理できます.
  • use()は、すべてのリクエストに有効です.(get、post等)
  • nextでは、現在のミドルウェアに次のミドルウェア関数を選択的に指定できます.
    ()何もない場合は、次のミドルウェアに移動してください.
  • const express = require('express')
    const app = express()
    
    let myLogger = function (req ,res, next) { //미들웨어를 등록합니다.
    	console.log('next')
      next()
    }
    
    app.use(myLogger) //미들웨어 함수 사용합니다.
    
    app.get('/', function(req, res) { // 라우팅 등록
    	res.send('Hello world')
    }).listen(3000)

    種類



    ルーティングとは?


    ルーティングとは、アプリケーションがクライアント要求にどのように応答するかを決定する特定のエンドポイント、例えばURIおよび特定のHTTP要求方法(GET、POSTなど)を指す.
  • パスの定義
    app.METHOD(PATH, HANDLER)
  • app:expressインスタンス
  • METHOD:HTTPリクエストの小文字方法.
  • PATH:サーバのパス.
  • HANDLER:パスマッチング時に実行される関数.(コールバック関数)
  • const express = require('express')
    const app = express()
    
    app.get('/', function(req, res) { //GET 메소드, '/' 라우터 등록
    	res.send('hello world')
    })
    //app.get()은 get경로('/')가 있는 HTTP 요청이 있을 때마다 호출될 콜백 함수를 지정
    
    app.post('/', function(req, res) {
    	res.send('hello world')
    })
    
    

    3.Expressミドルウェアタイプ


    (1)アプリケーションレベルミドルウェア


    appオブジェクトのapp.use()またはapp.METHOD()関数を使用して、appインスタンスのミドルウェアにミドルウェアをバインドします.
    app.get('/pages/:id', (req, res, next) => {
      //pages id가 0이면 'regular'가 아닌 'special'로 넘어감
      if (req.params.id == 0) next('route');
      //pages id가 0이 아니라면 'regular'로 넘어감
      else next();
    }, (req, res, next) => {
      res.send('regular');
    }
    });
    
    //pages id가 0일 때 넘어올 미들웨어
    app.get('/pages/:id', (req, res, next) => {
      res.send('special');
    }

    (2)ルータレベルミドルウェア


    express.ルータ()オブジェクトを使用して、ミドルウェアをルータインスタンスにバインドします.
    //app.js
    const express = require('express');
    const app = express();
    const pageRouter = ('./routes/pages');
    app.use('/pages', pageRouter);
    
    //pages.js
    const express = require('express');
    const router = express.Router();
    
    router.get('/pages/:id', (req, res, next) => {
      //pages id가 0이면 'regular'가 아닌 'special'로 넘어감
      if (req.params.id == 0) next('route');
      //pages id가 0이 아니라면 'regular'로 넘어감
      else next();
    }, (req, res, next) => {
      res.send('regular');
    }
    });
    
    //pages id가 0일 때 넘어올 미들웨어
    router.get('/pages/:id', (req, res, next) => {
      res.send('special');
    }
    
    module.exports = router;

    (3)エラー処理ミドルウェア


    エラー処理を担当するミドルウェアは、エラーを担当するミドルウェアであることを識別するために4つのパラメータを受け入れなければならない.
    app.use(function (err, req, res, next) {
    	res.status(400).send('err')
    })

    (4)サードパーティミドルウェア


    デフォルトで提供されるBuilt-inミドルウェアに加えて、インストールと使用が必要な他のミドルウェアをThird-partyミドルウェアと呼びます.
    これらのモジュールにはヘルメットとクッキー解析器が含まれています.