[TIL] Day36- Web Server(3)


Achievement Goals


  • Expressライブラリ
  • expressライブラリがどのタスクを簡単にするか理解できます.
  • ミドルウェアの概念は理解できる.

  • サーバの開発とデバッグ
  • CRUDを実行するWebサーバの開発方法を把握できます.
  • サーバの開発には、さまざまなツールを使用できます.
  • Expressライブラリ

  • expressライブラリがどのタスクを簡単にするか理解できます.
  • 簡略化操作の違いは、expressライブラリの例とexpressライブラリを使用しない例を使用して理解します.
    if (req.method === 'POST') {
        if (req.url === '/lower') {
          let data = '';
          req.on('data', chunk => {
            data = data + chunk;
          });
          req.on('end', () => {
            data = data.toLowerCase();
            res.writeHead(201, defaultCorsHeader);
            res.end(data);
          });
        } else {
          res.writeHead(404, defaultCorsHeader);
          res.end();
        }
      }
    上記の例では、expressが使用されていない場合、メソッドがPOSTの場合、reqが使用される.urlが「/lower」の場合、POSTが使用するデータもBufferを直接調整する必要があります.
    const express = require('express')
    const app = express()
    const jsonParser = express.json({strict:false})
    app.post('/lower', jsonParser , function(req,res){
      res.json(req.body.toLowerCase());
    })
    上記の例ではexpressライブラリを使用していますが、メソッドを検索する方法では、メソッドを指定するときに指定された符号化を実行し、Bufferもexpressライブラリを使用しています.その結果、式は未使用のものよりずっと簡単であることがわかります.
  • expressルーティング
  • ルーティングは、アプリケーションが、URI(またはパス)および特定のHTTP要求メソッド(GET、POSTなど)の特定のエンドポイントに対するクライアントの要求にどのように応答するかを決定する.
    ルーティングメソッドは、HTTPメソッドから派生し、expressクラスのインスタンスに接続されます.
    次のコードは、アプリケーションルートディレクトリのGETメソッドとPOSTメソッドのルーティング例です.
    // GET method route
    app.get('/', function (req, res) {
      res.send('GET request to the homepage');
    });
    
    // POST method route
    app.post('/', function (req, res) {
      res.send('POST request to the homepage');
    });
    expressがサポートする方法
    get、post、put、head、delete、options、trace、copy、lock、mkcol、move、purcfind、proppit、unlock、promppatch、unlock、report、mkativity、checkout、m-search、notify、subscribe、unspcribe、patch、connect.
    特殊なルーティング方法app.all()は、いかなるHTTP方法からも派生しない.このメソッドは、1つのパスですべてのリクエストメソッドにミドルウェア関数をロードするために使用します.
  • 経路
  • ルーティングパスは、リクエストメソッドとの組合せによって、リクエストを実装可能なエンドポイントを定義する.ルーティングパスは、文字列、文字列モード、または正規表現です.
    正規表現に基づくルーティングパスの例:
    次のルーティングパスは、ルーティング名に「a」が含まれているすべてのアイテムと一致します.
    app.get(/a/, function(req, res) {
      res.send('/a/');
    });
  • ルーティングハンドル
  • ミドルウェアと同様の複数のコールバック関数を指定することで、リクエストを処理できます.唯一の違いは、これらのコールバックは、next(「route」)を呼び出すことによって、残りのルーティングコールバックを迂回することができることである.これらのメカニズムを使用すると、ルーティングの前提条件を指定し、現在のルーティングを継続する理由がなく、制御を後続のルーティングに転送できます.
    複数のコールバック関数は、1つのルーティングを処理できます(次のオブジェクトを指定する必要があります).
    app.get('/example/b', function (req, res, next) {
      console.log('the response will be sent by the next function ...');
      next();
    }, function (req, res) {
      res.send('Hello from B!');
    });
    コールバック関数配列は、ルーティングを処理します.
    var cb0 = function (req, res, next) {
      console.log('CB0');
      next();
    }
    
    var cb1 = function (req, res, next) {
      console.log('CB1');
      next();
    }
    
    var cb2 = function (req, res) {
      res.send('Hello from C!');
    }
    
    app.get('/example/c', [cb0, cb1, cb2]);
    独立した関数と関数配列の組合せは、単一のルーティングを処理することができる.
    var cb0 = function (req, res, next) {
      console.log('CB0');
      next();
    }
    
    var cb1 = function (req, res, next) {
      console.log('CB1');
      next();
    }
    
    app.get('/example/d', [cb0, cb1], function (req, res, next) {
      console.log('the response will be sent by the next function ...');
      next();
    }, function (req, res) {
      res.send('Hello from D!');
    });
  • 中端でよく使われる4種類の
  • 1.すべてのリクエストのurlまたはメソッドをチェックする
    var app = express();
    
    app.use(function (req, res, next) {
      console.log('Time:', Date.now());
      next();
    });
    マウントパスなしのミドルウェア関数-要求を受信するたびに正常に動作します.
    2.構造化POST要求等を含むbody(負荷)の場合(容易に取得したい場合)
    上記のexpressを簡略化すると、bodyの構造化が容易になる例が見られる.
    3.すべての要求/応答にCORSヘッダを付けなければならない
    既存の-writeHeadとendメソッドの使用
    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の使用
    //1. 모든 요청/응답에 CORS헤더를 붙일 때
    const cors = require('cors')
    
    app.use(cors())
    
    //2. 특정 메소드에만 붙일 때
    const cors = require('cors')
    app.get('/products/:id', cors(), function (req, res, next) {
      res.json({msg: 'This is CORS-enabled for a Single Route'})
    })
    4.認証要求ヘッダーにユーザー認証情報が含まれているかどうかを確認する
    認証情報実装ミドルウェア
    httpリクエストにトークンがあるかどうかを判断し、ログインしている場合は成功し、そうでない場合はエラーのミドルウェアを送信します.
    
    
    app.use((req, res, next) => {
      // 토큰이 있는 경우만 받아준다.
      if(req.headers.token){
        req.isLoggedIn = true;
        next()
      } else {
        res.status(400).send('invalid user')
      }
    })
    ミドルウェアが親ミドルウェアからsendに応答を送信すると、他のミドルウェアは動作しません.また、next()を介して次のミドルウェアに送信しないと、無限ロードに陥る可能性があります.(確認、不確定)

    サーバの開発とデバッグ

  • CRUDを実行するWebサーバの開発方法を把握できます.
  • まず,CRUDを実行するには各メソッドに対して必要であり,メソッドを作成するにはルータやコントローラなどが必要である.
    Webサーバの開発によく使われるアプリ.jsフレームワークはこうです.
    //外部モジュール
    const express = require('express')
    //内部モジュール
    //グローバル変数
    const app = express();
    const port = 81;
    //ルーティングモジュール
    //実行ロジック
    app.use(cors());
    //useとは?サーバを実行する前にexpressにuseパラメータを登録する
    app.use(express.json())
    app.get('/', function(req, res) {
    res.status(200).send("Welcome!");
    })
    //expressで登録してあげますか?
    //getはuseに基づいて実装されます(useはexpressに通知されます)
    //=> app.listenサーバを実行するロール
    //app.listen(port, callback() => {
    console.log('start server')
    })
    大きく五つに分けて書くのが一般的なアプリですjs、特に
    app.listen(port, callback() => {
        console.log('start server')
    上のlistenはサーバの実行を担当していますが、それがなければサーバは動作しません.
  • サーバの開発には、さまざまなツールを使用できます.
  • サーバの開発に役立つツールは次のとおりです.
    postman/nodemon/express/node debugなどを使用します.
    postmanでは,GUIにより直接サーバにメソッドを要求してもよいし,応答を受信してもよい.
    Nodemonの場合、元のサーバのコードを変更するたびにサーバを再起動する必要がありますが、nodemonを使用すると保存時に自動的にサーバがリフレッシュされます.
    node debugについては、ツールが正しいと思います.
    普段CLIではnode appを使用しています.jsまたはnodemon app.jsでサーバーをアクティブにしましたが.
    node --inspect app.jsまたはnodemon--inspect app.jsを打つと、クロム開発者ツールが新しいボタンをアクティブにします.
    緑のノードアイコンをクリックします.

    このように表示されたときappjs上のコンソール.ログを撮って確認できます.
    他の授業で学んだことは、スプレーの中で重要なのはすべて問題に答えるのではなく、appです.js/Router.js/Controller.jsを分離してルーティングを行い,様々な方法への応答を行い,最後にappでアクティブ化(?)する.分割する
    サーバを学習するとともに,システム分割アプリケーションの確認を行うことが重要である.
    サーバーを知っていて、正直面白いと思います.