Node.js
Node.jsとは
Node.jsとは、Javasriptをサーバ上で実行できるようするものである。
基本的にJavasriptはブラウザ上で実行されるが、Node.jsを使用するとサーバ上でも使用できるようになる。
Webブラウザ上でのJSと、node.js上でのJSの機能の違い
Webブラウザ上では、
ECMAScript
document(DOM API)、alertなど使える
ES Module
グローバルオブジェクトはwindow
node.jsでは
ECMAScript
CommonJSを使う
ES Module
グローバルオブジェクトはglobal
Vscodeでnpmコマンドのエラーが出る場合
PowerShellを管理者として実行
↓
Set-ExecutionPolicy RemoteSigned
↓
Y入力
↓
Vscode再起動
CommonJSとES Moduleの違いとメリットデメリット
CommonJSをブラウザ上で使えるようにするには
CommonJSをブラウザ上で使えない。(ES Moduleは使える)
使えるようにするには、WebpackやBrowserifyを使ってバンドルするのが必要
なお、バンドル化のメリットはそれ以外もメリットがある。
webpack.config.js
webpack.config.jsはwebpackの設定を記述するファイルである。
これを記述することで、
バンドル化やトランスパイルやminifyなどの設定を行える。
設定項目の説明は以下を参照する。
Volta
package.jsonとpackage-lock.json
Node.js プロジェクトの「設定ファイル」のようなもので、そのプロジェクトに関する情報や、必要なパッケージ(ライブラリ)、スクリプトなどを定義するために使われます。Node.js のプロジェクトにはほぼ必ずこのファイルが含まれています。
npmコマンド
npmとは
npmとは、Node.js のパッケージマネージャーのことで、正式には Node Package Manager と呼ばれます。JavaScript のライブラリやツールを簡単に管理・インストールできる便利なツールです。
package.jsonに記載されているdependenciesまたはdevDependenciesからnpm installコマンドでインストールしてきます。
よく使うnpmコマンド
様々なnpm run
以下のことが可能。
スクリプトに引数を渡す
複数コマンドの連続実行
並列実行(同時実行)
スクリプトの中で別のスクリプトを呼ぶ
動的なスクリプト実行(環境ごとに変える)
npm-run-all で一括制御
スクリプト内での変数展開
インタラクティブな CLI と組み合わせる
スクリプトで使えるシェルコマンド
ローカルパッケージとグローバルパッケージの違い
グローバルパッケージのインストール先
npm root -g
ダウンロードしてきたパッケージのサイトを開く
npm docs package.jsonのname
ダウンロードしてきたパッケージのダウンロードサイトを開く
npm repo package.jsonのname
npm linkで他のパッケージから処理を呼び出す
この場合は、npm linkを使用する。
なので、利用するpackage.jsonで以下の記述するとこの事象は起きない。
"dependencies": {
"lib-prj": "file:../lib-prj"
}
パッケージ読み込ませる
import _ from パッケージ名
パッケージ名を指定すると、node_modulesの中のパッケージ名と同じフォルダ名を読み込む。
例えば
import _ from 'lodash';
だと
以下のloadshが読み込まれる
nodemonでソースコードの変更を監視して、自動的にアプリケーションを再起動する
通常、Node.js アプリを変更した後は、自分で手動で再起動(ctrl + c → node app.js など)しなければなりませんが、nodemon を使えばそれが不要になります。
E2Eテストやスクレイピングを行えるPlaywrite
Playwriteは、WebブラウザのE2Eテストにもスクレイピングなどを行えるツールである。
基本的な使い方
Webサイトの情報をcsvファイルに書き込む
Googleスプレッドシートから値を取得・書き込み
cronで処理を定期実行する
.envファイルから値を読み込む
nodemailerでメール送信を行う
API周り
URLごとに処理を分ける
以下の三つがある。
素のhttpモジュールを使う
Expressを使う(実用的で簡単)
ルーティングを分ける(Express + モジュール分割)
Routerでルーティングを見やすくする
ステータスコードやヘッダー情報を設定する
HTTPメソッドの取得方法とGETとPOSTのデータ取得方法
なお、もし頻繁にPOSTでJSONを扱うならExpressの方が簡単に書ける
フォームのデータをJSON形式で送り、サーバ側でそれを取得する
ミドルウェアとルートハンドラ
図
リクエスト
↓
[ミドルウェア①] → [ミドルウェア②] → [ルートハンドラ]
↓ ↓ ↓
ログ記録 認証チェック DBからデータ取得&レスポンス
ミドルウェア
リクエスト(req)とレスポンス(res)の処理の途中に挟まる関数。
認証、ログ記録、リクエストの加工、レスポンスの前処理などに使う。
const logger = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // 次に進む
};
app.use(logger); // 全リクエストにこのミドルウェアが適用される
基本的な事項
return next()する理由 エラーハンドリング なお、ミドルウェアはurlは前方一致である。ルートハンドラ
特定のURL(エンドポイント)とHTTPメソッドに対して最終的な処理をする関数。
データベースから情報を取得したり、レスポンスを返したりするのが主な役割。
app.post('/login', (req, res) => {
const { username, password } = req.body;
// ログイン処理
res.send('ログイン成功');
});
様々なミドルウェア(Express)
Expressのリクエストバリデーション
MongoDBのCRUD処理
検索
登録
削除
更新
Discussion