Node.js教科書-1


1.フォルダ管理


app.js:コアサーバスクリプト


public:外部からアクセス可能なファイルを収集します。


views:テンプレートファイルを収集します。


routes:サーバ上のルータと論理を収集します。


2. Rest API


REST API:状態伝送を表す略語で、ネットワーク構造の一種である。サーバ上のリソースを定義する方法と、リソースのアドレスを指定する方法を示します。


  • GET:サーバ上のリソースを取得するために使用されます.データを龍青本文(body)に入れない.データはクエリーを使用します.

  • POST:サーバに新しいリソースを登録します.新しく登録したデータをリクエストの本文に入れます.

  • PUT:サーバ上のリソースを要求中のリソースに変換します.置換するデータを要求の本文に挿入します.

  • PATCH:サーバリソースの一部のみを変更できます.変更するデータの一部をリクエストの本文に挿入します.

  • DELETE:サーバ上のリソースを削除します.
  • put vs patch
    ユーザリストで特定のユーザの情報を変更するとpatchはそのユーザの値を変更しますが、putは完全なリストをインポートした後に戻り値を変更します.
    ソース

    3.HttpとHttps&Http 2


    httpsモジュールは、WebサーバにSSL暗号化を追加します。

  • http
  • const http = require('http');
    
    http.createServer((req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
      res.write('<h1>Hello Node!</h1>');
      res.end('<p>Hello Server!</p>');
    })
      .listen(8080, () => { // 서버 연결
        console.log('8080번 포트에서 서버 대기 중입니다!');
      });
  • https
  • const https = require('https');
    const fs = require('fs');
    
    https.createServer({
      cert: fs.readFileSync('도메인 인증서 경로'),
      key: fs.readFileSync('도메인 비밀키 경로'),
      ca: [
        fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
      ],
    }, (req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
      res.write('<h1>Hello Node!</h1>');
      res.end('<p>Hello Server!</p>');
    })
      .listen(443, () => {
        console.log('443번 포트에서 서버 대기 중입니다!');
      });
  • http2
  • const http2 = require('http2');
    const fs = require('fs');
    
    http2.createSecureServer({
      cert: fs.readFileSync('도메인 인증서 경로'),
      key: fs.readFileSync('도메인 비밀키 경로'),
      ca: [
        fs.readFileSync('상위 인증서 경로'),
        fs.readFileSync('상위 인증서 경로'),
      ],
    }, (req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
      res.write('<h1>Hello Node!</h1>');
      res.end('<p>Hello Server!</p>');
    })
      .listen(443, () => {
        console.log('443번 포트에서 서버 대기 중입니다!');
      });
    httpモジュールとほぼ同じで、証明書に関連するオプションオブジェクトを最初のパラメータで受信します.
    ノード上のhttp 2モジュールは、最新のHTTPプロトコルhttp 2とSSLを使用して暗号化されます.従来のhttp 1よりも効率的なリクエスト(Web速度の向上)
    ソース

    4.非同期方式でタスクをバックグラウンドに送信して処理し、終了順に実行する。これはオペレーティングシステムによって決定され、順序を遵守する必要があるタスクに対しては同期または非同期で実行されますが、順序を遵守する必要があります。では、同期方法と非同期方法ですが、コールバック(またはpromise)を連続的に使用して順序を守る方法にはどのような違いがあるのでしょうか。


    *非同期

    const fs = require('fs').promises;
    
    fs.writeFile('./wirteme.txt', '글이 입력됩니다.')
    .then(() => {
        return fs.readFile('./writeme.txt');
    })
    .then((data) => {
        console.log(data.toString());
    })
    .catch((err) => {
        throw err;
    });

    *同期

    const fs = require('fs');
    
    const data = fs.readFileSync('./readme.txt');
    console.log('1번', data.toString());

    2つのファイルが5回繰り返し実行されると、5回の同期メソッドのファイルが実行され、最初のタスクがすべて実行され、2番目のタスクが実行されます。ただし、非同期メソッドのファイルを5回繰り返すと、0個のファイルグループ5個がバックグラウンド非同期実行に入る違いがあります。


    5.Worker Threadとは


    6.いわゆるクラスタ


    デフォルトでは、シングルスレッドノードはすべてのCPUコアのモジュールを使用できます。


    複数の共有ポートを持つノードプロセス。


    複数のCPUを用いてサーバ負荷を分散するが,セッションを共有できないという欠点がある.(Redisなどのサーバを導入することで解決)
    実際の作業では,pm 2などのモジュールとしてクラスタ機能を用いる.

    リフレッシュ時にプロセッサを終了するコード

    const cluster = require('cluster');
    const http = require('http');
    const numCPUs = require('os').cpus().length; // 내 cpu 개수를 구해준다.
    if (cluster.isMaster) { 
      console.log(`마스터 프로세스 아이디: ${process.pid}`); //Master process는 요청을 Round Robin
      // 알고리즘에 의해 워커 프로세스한테 분배해주는 역할을 한다.
      // Master process에서 fork를 해서 CPU 개수만큼 워커 프로세스를 생산
      for (let i = 0; i < numCPUs; i += 1) {
        cluster.fork();
      }
      // 워커가 종료되었을 때
      cluster.on('exit', (worker, code, signal) => {
        console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
        console.log('code', code, 'signal', signal);
      });
    } else {
      // 워커들이 포트에서 대기
      http.createServer((req, res) => {
        res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
        res.write('<h1>Hello Node!</h1>');
        res.end('<p>Hello Cluster!</p>');
        setTimeout(() => { // 워커 존재를 확인하기 위해 1초마다 강제 종료
          process.exit(1);
        }, 1000);
      }).listen(8086); //원래는 하나의 프로그램은 하나의 프로세스를 차지하고
      //하나의 프로세스는 하나의 포트를 차지한다.
      //하지만 Cluster를 하면 여러 개의 프로세스을 하나의 포트에 묶어 놓을 수 있다.
      console.log(`${process.pid}번 워커 실행`);
    }
    <結果画面>
    コード実行時にlocalhostでリフレッシュを繰り返す場合、
    このように、実行順序の逆順序でスーツケースプロセッサを閉じ、すべて閉じたときにリフレッシュするとエラーが発生します.

    終わりだ!