Open7

NestJSとexpressやNode.jsについてメモ

yimajoyimajo

概要

  • NestJSについて調べる
    • 根幹の部分
      • expressとは
      • Node.jsとは

TL;DR

  • 根幹の部分
    • expressをベースにしており根幹ではNode.jsが動いてる
    • Node.jsはシングルスレッドの非同期処理でリクエストをさばく
    • expressはサーバサイドの機能をやりやすくしてくれる
      • ルーティング
      • ビューヘルパー
      • セッション管理
yimajoyimajo

https://expressjs.com/ja/

Higlights

Express は、Web アプリケーションとモバイル・アプリケーション向けの一連の堅固な機能を提供する最小限で柔軟な Node.js Web アプリケーション・フレームワークです。

Express は、ユーザーが使い慣れている Node.js の機能をわかりやすくし、基礎的な Web アプリケーション機能をシンプルな階層で提供します。

yimajoyimajo

https://qiita.com/nkjm/items/723990c518acfee6e473

Highlights

これは例えば正規表現などのパターンマッチングを使ってURIを解析することでも実現できますが、Expressを使うと下記のシンプルなコードで実現できます。

コメント

express単体で(NestJS使わずに)APIサーバ作れるわけね

yimajoyimajo

https://atmarkit.itmedia.co.jp/ait/articles/1503/04/news047.html

Highlights

Webアプリを構成する上で必要な機能がそろっており、ルーティングやビューヘルパー、セッション管理の機能もデフォルトで提供しています

また、ミドルウエアとしての機能を使用し、Expressの機能を独自に拡張することもできます

MEANスタックアプリにおけるExpressは

MEANについてはとりあえず気にしない

コメント

わかりやすい

  • ルーティング
  • ビューヘルパー
  • セッション管理
yimajoyimajo

https://www.passportjs.org/

Highlights

Passport is authentication middleware for Node.js. Extremely flexible and modular, Passport can be unobtrusively dropped in to any Express-based web application. A comprehensive set of strategies support authentication using a username and password, Facebook, Twitter, and more.

コメント

Node.jsでよく使う認証ミドルウェア?なのかExpressベースのWebサービスに使えると書いてある。

yimajoyimajo

https://nodejs.org/ja/about/

Highlignts

Node.js はスケーラブルなネットワークアプリケーションを構築するために設計された非同期型のイベント駆動の JavaScript 環境です。

これは OS のスレッドが採用されている一般的な同時実行モデルとは対照的です。 スレッドベースのネットワーキングは比較的非効率であり、使うのはとても困難です。

スレッド使わない、と

さらに Node.js にはロックがないので Node.js ユーザーはプロセスのデッドロックの悩みから開放されます。 ほとんどの Node.js の関数は I/O を直接実行しないため、プロセスをブロックしません。 ブロックしないのでスケーラブルなシステムを開発するのに Node.js はとても最適です。

I/Oを直接実行しない -> 間接的に実行するということ?

間接的に実行するということでプロセスをブロックしない?

Node.js は Ruby の Event Machine や Python の Twisted のシステムに影響を受けていて、同様の設計です。

  • Event Machine
  • Twisted

Node.js はランタイムコンストラクタの替わりにライブラリとしてイベントループを提供し、さらに小さなイベントモデルを持ちます。 ほかのシステムではイベントループの開始時にブロッキングコールが常にあります。 典型的な例ではスクリプトの先頭で動作をコールバックを用いて定義し、 最後に EventMachine::run() のようなブロッキングコールでサーバを起動します。

イベントループの開始時にブロッキングする(?)

Node.js ではそのようなイベントループを開始する呼び出しはありません。 Node.js は単純にスクリプトを実行した直後にイベントループが開始されます。 実行するコールバックがこれ以上ない場合に Node.js はイベントループから抜けます。 この動作はブラウザ上の JavaScript と似ています — イベントループはユーザからは隠されます。

  • スクリプトを実行した直後にイベントループが開始
  • 実行するコールバックがこれ以上ない場合にイベントループから抜ける

図で知りたい

yimajoyimajo

https://engineer.recruit-lifestyle.co.jp/techblog/2019-12-13-node-async-io/

Highlights

あまりにも多くのリクエストが届くと、その分だけプロセス/スレッドが作成されて、メモリの消費量が多くなったり、コンテキストスイッチによって、パフォーマンスが落ちる可能性があります。これは C10K 問題として知られている問題です。

  • C10K

Node.js はこの C10K 問題を解決できるものとして注目されていました。Node.js はマルチスレッドで実行するのではなく、シングルスレッドで実行するため、C10K 問題を解決することができます。しかし、シングルスレッドで動かすことは、処理の同時実行を考えると非効率な実行方法にも見えます。そこで Node.js は処理をスレッドの数に分散させるのではなく、時間軸で分散することで同時実行できない問題の解決を図っています。

  • 時間軸で分散(?)

Node.js では後続処理をブロッキングしない非同期 I/O として利用できます。

なるほど、単に同期処理を避けてるだけか。非同期処理を使ってるっていう話ね。

Node.js はこの非同期 I/O を駆使して、時間軸で処理を分散することができます。

時間軸で〜っていう表現あってるのかな。

Node.js では Reactor Pattern と呼ばれる方法で、複数の I/O を処理します。このパターンでは I/O が完了したかを監視するために、OS から提供されている監視機能を使います。

なるほど、非同期実行開始してすぐ戻し、event loopにキューとして完了処理を積むわけね。

コメント

わかりやすかった。

参考書籍が示されてるのもありがたい

https://www.oreilly.co.jp/books/9784873118734/