[TIL] Node.js - Express.js



リクエスト主体のデータを検索するのはいつもエラーで大変でした.
Unexpected token "in JSON at position 0
送られてきたデータはオブジェクトや配列ではなく文字列だけでexpress.json()でデータマイニングはできないようですが、どこを修正するのかわからずうろうろしていました.最初に,送信要求のページコードを変更し,文字列ではなくキー値オブジェクト型に送信することで解決する.しかし他の人はクライアントコードに触らずサーバーコードだけを修正してもいいと言っているのでExpress.しばらくjs公式文書を見ました.フェルさんと沈黙の中で答えを探して、二人はほとんど同時に答えを見つけた.express.json()strictオプションをfalseに変更し、オブジェクトや配列でなくても読み取ることができます...!

Today I Learned


Express.jsとは何ですか。

  • WebサーバのNodeの導入を支援します.js上のWebフレームワーク
  • フレームワーク:一般的な重複タスクを自動化することで、
  • の迅速な開発を支援
  • Node.jsで最も一般的なフレームワーク
  • Express.なぜjsを使うのですか?

  • Node.jsのAPIを簡素化し,有用な新機能を追加し,直感的で読みやすい.
  • やわらかい.最低限の機能のみを提供し、必要に応じてミッドレンジを組み合わせて使用できます.
  • ルーティング、要求主体コンテンツの読み込み、CORSの適用などが容易になる.
  • Express.jsの起動

    $ npm install express --save

    Express.jsを使用したサーバの作成

    const express = require('express');
    const app = express();
    const port = 3000;
    
    app.get('/', (req, res) => {
      res.send('Hello World');
    });
    
    app.listen(port, () => {
      console.log(`server listening at http://localhost:${port}`);
    });
    応用
  • CORS
  • const cors = require('cors'); // npm install cors로 설치 후 사용
    
    // CASE 1 : 모든 요청에 적용
    app.use(cors()); 
    
    // CASE 2 : 특정 라우트에만 적용
    app.get('/', cors(), (req, res) => {
      res.send('Hello World');
    }); 
    
    // CASE 3 : CORS 옵션
    app.use(cors({
      origin: 'http://allowonlythiorigin.com'
    }))
  • Routing
  • // app.METHOD(PATH, HANDLER);
    
    // Example :
    app.get('/', (req, res)=> {
      res.send('Hello World');
    });
    
    app.post('/post', (req, res) => {
      // some action to create a new post based on 
      // the data in the request body
    })
  • Parsing Request Body
  • app.use(express.json());
    
    // express.json 옵션 설정
    // exporess.json({strict: false}) => 배열이나 객체가 외 자료형도 가능 (디폴트 true)
    
    let posts = [];
    
    app.post('/post', (req, res) => {
      const newPost = {
        createdAt: new Date().toISOString(),
        title: req.body.title.toUpperCase(),
        author: req.body.author,
        content: req.body.content,
        id: nanoid()
      }
      posts.push(newPost);
      return res.status(200).json({id: newPost.id})
    })
    
    // POST '/post'
    
    // body :
    // {
    //   title: "Hello World",
    //   author: "Alex J. Lee",
    //   content: "Welcome to my blog!"
    // }
  • Reading Parameters/Query Strings
  • // Using Parameter => req.params
    // GET '/posts/someid'
    app.get('/posts/:id', (req, res) => {
      const data = posts.filter(post => {
        return post.id === req.params.id;
      })
      return res.json(data);
    })
    
    // Using Query String => req.query
    // GET 'posts/?title={query}'
    app.get('/posts', (req, res) => {
      if (req.query.title !== undefined) {
        const filteredPosts = posts.filter(post => {
          return post.title.includes(req.query.title.toUpperCase());
        });
        return res.status(200).json(filteredPosts);
      }
      res.json(posts);
    })

    Middlewareとは?

  • Expressアプリケーションは、一連のミドルウェア関数呼び出しです.
  • ミドルウェア関数は、要求オブジェクト(req)、応答オブジェクト(res)、および次のミドルウェア関数(next)へのアクセス権を有する.
  • ミドルウェア関数は、クライアントとサーバとの間のHTTP要求/応答ストリーム上で実行される関数である.
  • のミドルウェア関数が完了すると、次のミドルウェア関数が呼び出されます(next).順番は順番に呼び出されるので、順番が重要です.これ以上接続可能なミドルウェアがなければ、終わります.
  • Middlewareはどこで使用されますか?


    自動アプリケーション
  • CORSヘッダ(cors)
  • 自動解析
  • 要求体(body-parserまたはexpressが提供する解析器)
  • エラー処理およびデバッグ
  • プレフィックス(プレフィックス)が重複する場合のルーティング処理に寄与する
  • .
  • 権限処理(ヘッダ上の認証情報による)
  • Middlewareの実装例

    // 관리자 권한이 있는지 확인
    const checkAdmin = (res, req, next) => {
      if (req.headers.Authentification === "admin") {
        next();
      } else {
        res.send("You don't have access");
      }
    }
    
    app.post('/admin-only', checkAdmin, (res, req) => {
      // ...
    })