Node.js がわからないので雑にやってみる 2 〜Express編
雑にやっています。
前回
Expressとは?
公式
Fast, unopinionated, minimalist web framework for Node.js
Node.js 用の高速で固定観念のないミニマリスト Web フレームワーク
らしいです。
MDM
Quiita
やる
今回はこれをやる
環境構築
環境構築
ターミナルでもVS Codeでもいいや。
mkdir express-tutoria
cd express-tutorial
npm init -y
code .
Expressとnodemonと入れる
npm i express nodemon
npm i express nodemon は、Node.jsのプロジェクトに2つのパッケージ(express と nodemon)をインストールするためのコマンド
npm i とは?
npm(Node Package Manager)は、Node.jsのパッケージ管理ツールです。
i は install の短縮形で、指定されたパッケージをインストールします。
コマンドを実行すると、指定したパッケージが node_modules フォルダにインストールされ、package.json ファイルの dependencies に追加されます。
express とは?
今回やるのは主にここ。
Express は、Node.jsの軽量なウェブフレームワークです。前述の通り、ウェブアプリケーションやAPIサーバーの開発をシンプルにしてくれます。
Expressをインストールすることで、HTTPリクエストやレスポンス、ルーティング、ミドルウェアなどを簡単に扱えるようになります。
nodemon とは?
前回のおさらいですね。
Nodemon は、Node.jsアプリケーションを開発中に自動的に再起動してくれるツールです。ファイルの変更を検知し、自動的にサーバーを再起動してくれるので、いちいち手動でサーバーを再起動する手間が省けます。
これにより、開発作業がスムーズに進み、リアルタイムで変更が反映されます。
![](https://assets.st-note.com/img/1726375997-yoXcRtFeTrHzPhWAgfENjbdV.png?width=1200)
環境構築したら確認
server.jsファイル用意する
適当なコンソールログ書く
![](https://assets.st-note.com/img/1726376349-VTl30NPMLrb1Jnd6FAQuE2mR.png?width=1200)
package.jsonのscripts追加
![](https://assets.st-note.com/img/1726376274-BUVvcCkNYMazwiJP465QlGL2.png?width=1200)
npm run dev
![](https://assets.st-note.com/img/1726376337-BuHh5PEU1DJisGqTSp0IxVR3.png?width=1200)
nodemonにより、server.jsを書き換えたらリロードしてくれている
![](https://assets.st-note.com/img/1726376423-oADrcI6KPplTEMtwORYNh1ma.png?width=1200)
Express
Express 第一歩
Node.jsとExpressを使ってポート3000でサーバーを起動する。
const express = require("express");
const app = express();
const PORT = 3000;
app.listen(PORT, () => console.log("サーバーが起動しました。"));
require("express") で、Expressモジュールをインポートする。
const app = express();
express() を呼び出すことで、アプリケーションのインスタンスを作成。この app はサーバーとして機能し、HTTPリクエストのハンドリングやルート設定を行う。
const PORT = 3000;
PORT にはサーバーがリッスンするポート番号を指定しています。ポート番号3000は、開発環境でよく使われる標準的なポートの一つです。
サーバーがこのポート番号でリクエストを受け取る準備をします。
app.listen(PORT, () => console.log("サーバーが起動しました。"));
app.listen(PORT) は、指定されたポートでサーバーを起動して、クライアント(ブラウザなど)からのリクエストを待ち受けます。
() => console.log("サーバーが起動しました。") はコールバック関数です。サーバーが無事に起動した後に実行され、「サーバーが起動しました。」というメッセージをコンソールに出力します。
![](https://assets.st-note.com/img/1726377669-ftspOyc7zAdGZgwebQi09oq4.png)
ルーティング はじめに
Expressを使ってサーバーを起動し、http://localhost:3000/ にアクセスした際にコンソールにメッセージを出力する
const express = require("express");
const app = express();
const PORT = 3000;
app.get("/",(req,res)=>{
console.log("Hello express");
});
app.listen(PORT, () => console.log("サーバーが起動しました。"));
↓追加部分
app.get("/",(req,res)=>{
console.log("Hello express");
});
実際の動作
コードを実行すると、サーバーがポート3000で待機します。
ブラウザで http://localhost:3000/ にアクセスすると、サーバーが app.get() で定義された処理を実行し、コンソールに "Hello express" が表示されます。
ただし、現状ではクライアント(ブラウザ)に対して何も表示されず、サーバー側のコンソールにのみログが出力される状態です。
![](https://assets.st-note.com/img/1726377989-sxmYz4i17B5audrgqGy92ADj.png)
ブラウザにも文字を表示する
res.send("こんにちは"); を追加
const express = require("express");
const app = express();
const PORT = 3000;
app.get("/",(req,res)=>{
console.log("Hello express");
res.send("こんにちは");
});
app.listen(PORT, () => console.log("サーバーが起動しました。"));
![](https://assets.st-note.com/img/1726378137-GELjH3Dt9Zz6JOvwSku27UWM.png)
res.send("<h1>こんにちは</h1>"); のようにタグにするとh1見出しでブラウザに表示される。
![](https://assets.st-note.com/img/1726378237-rVo9fvLT8bPUaWEIF1DARleO.png)
ステータスコード
const express = require("express");
const app = express();
const PORT = 3000;
app.get("/", (req, res) => {
// console.log("Hello express");
// res.send("<h1>こんにちは</h1>");
// res.sendStatus(404);
// res.status(500).send("エラーです。");
res.status(500).json({ msg: "エラーです。" });
});
app.listen(PORT, () => console.log("サーバーが起動しました。"));
![](https://assets.st-note.com/img/1726378391-DjAzgJPXFaLoHY83O5BWsKcm.png)
![](https://assets.st-note.com/img/1726378444-OV0mzBWUa7xwnJ13qAYdMNPL.png)
![](https://assets.st-note.com/img/1726378572-06Ggi9TVNFRXrx8jevMhbtA3.png)
![](https://assets.st-note.com/img/1726378722-uTCDF0XPa7QEZBVIGrJnxkW4.png)
エンドポイント /user にアクセスしてみる
const express = require("express");
const app = express();
const PORT = 3000;
app.get("/", (req, res) => {
// console.log("Hello express");
// res.send("<h1>こんにちは</h1>");
// res.sendStatus(404);
// res.status(500).send("エラーです。");
res.status(500).json({ msg: "エラーです。" });
});
app.get("/user", (req, res) => {
res.send("ユーザーです。");
});
app.listen(PORT, () => console.log("サーバーが起動しました。"));
/user にアクセスした場合の流れ
サーバーがポート3000で起動しています。
ブラウザで http://localhost:3000/user にアクセスすると、サーバーにGETリクエストが送信されます。
サーバーは、このリクエストに対して事前に設定されたルートハンドラ(app.get("/user", ...))を見つけ、その中の処理を実行します。
res.send("ユーザーです。") が呼ばれ、サーバーはクライアントに「ユーザーです。」という文字列をレスポンスとして返します。
ブラウザには、「ユーザーです。」というメッセージが表示されます。
![](https://assets.st-note.com/img/1726379149-fwKVLzbYtMmSW5eIvjrx8ciU.png)
/user/info も追加してみる
![](https://assets.st-note.com/img/1726379095-6SX5TrkhBbLmuoPxyK1c9ICY.png?width=1200)
![](https://assets.st-note.com/img/1726379075-d8LT3JhovmUfP6segNEc4ynk.png)
ルーティング(ファイルを切り分けて管理する)
routesフォルダを作って、user.jsファイルを作ります。
![](https://assets.st-note.com/img/1726456512-3XoZWfdIecyqHBmFNuGpJrh6.png)
server.jsに書いていた以下のコードを削除
app.get("/user", (req, res) => {
res.send("ユーザーです。");
});
app.get("/user/info", (req, res) => {
res.send("ユーザー情報です。");
});
user.jsは 以下のようになる。
module.exports = router; で外から呼び出せるようにしている感じね。
const express = require("express");
const router = express.Router();
router.get("/", (req, res) => {
res.send("ユーザーです。");
});
router.get("/info", (req, res) => {
res.send("ユーザー情報です。");
});
module.exports = router;
server.jsは 以下のようになる
require("./routes/user");で user.jsで作ったrouterを呼び出している感じ。
const express = require("express");
const app = express();
const userRouter = require("./routes/user");
const PORT = 3000;
app.get("/", (req, res) => {
// console.log("Hello express");
// res.send("<h1>こんにちは</h1>");
// res.sendStatus(404);
// res.status(500).send("エラーです。");
res.status(500).json({ msg: "エラーです。" });
});
//ルーティング
app.use("/user", userRouter);
app.listen(PORT, () => console.log("サーバーが起動しました。"));
/user 以下は、userRouterに任せるって感じ。
ブラウザ表示確認
![](https://assets.st-note.com/img/1726457039-rVmyXaA7U9JvDLPjpMz2udf8.png)
![](https://assets.st-note.com/img/1726457053-pwfjDOGIVudyoWZvREzANqY6.png)
![](https://assets.st-note.com/img/1726457132-ALax6jIVOXbdBMqQ7Ze5HNl4.png)
今後の拡張性
app.use("/auth", authRouter); みたいにして、コード足して、authRouterの中身を書いていけば良い、と。なるほど。
![](https://assets.st-note.com/img/1726457265-DYfenhmaPjVzCA5v2GtyLirB.png?width=1200)
ランダム文字列の対応(動的なURLパラメータを処理する仕組み)
:id
router.get("/:id", (req, res) => {
res.send(`${req.params.id}のユーザー情報を取得しました。`)
});
![](https://assets.st-note.com/img/1726457696-uw9chkFJ16jEgBz5lMKeXGnP.png?width=1200)
![](https://assets.st-note.com/img/1726457704-cyNKVIv7hgBFbmOkY94Ea8HS.png)
処理の流れ:
クライアントが http://localhost:3000/user/123 のようなリクエストを送ると、このルートがマッチします。
URLの 123 の部分が req.params.id に格納されます。
res.send() を使って、123のユーザー情報を取得しました。 というメッセージがクライアントに返されます。
適当な文字列でもできる(できちゃう
![](https://assets.st-note.com/img/1726457865-fDatqNjQdKCubrMHe1U6hgp2.png)
今は、GETしか作ってない。
ブラウザ叩くのは基本GETしかない。
POSTはフォーム置いたりして指定しないといけない。
あとはPOSTMANで確かめるとか。
![](https://assets.st-note.com/img/1726457937-jWFqauypsrIEoJ73MiTUKlPA.png?width=1200)
POST、DLETEを自作したい人は、Web APIの作り方という動画にてとのこと。よくできてるなー。
https://youtu.be/9HXcaDQyWxA?si=ZViovYoNx1riazuG
横道。idのバリデーションはどないすんねや?エラーハンドリングは?
バリデーション
idが期待される形式(例えば、数値や特定の文字列パターン)かどうかを確認し、必要に応じてバリデーションを行う
router.get("/:id", (req, res) => {
const id = req.params.id;
if (!/^\d+$/.test(id)) { // 例: idが数字のみで構成されているかをチェック
return res.status(400).send("無効なユーザーIDです。");
}
res.send(`${id}のユーザー情報を取得しました。`);
});
エラーハンドリング
指定されたidに対応するユーザーが存在しない場合や、データベースエラーが発生した場合のエラーハンドリングも考慮する必要がありそー(特に実務的には)
router.get("/:id", async (req, res) => {
try {
const user = await getUserById(req.params.id); // 仮の非同期関数
if (!user) {
return res.status(404).send("ユーザーが見つかりません。");
}
res.json(user);
} catch (error) {
console.error(error);
res.status(500).send("サーバーエラーが発生しました。");
}
});
htmlを表示(静的ファイルを表示)
app.use(express.static("public"));
![](https://assets.st-note.com/img/1726458344-ZgHd0CA9ILfrNmt1wSbPlpQ2.png?width=1200)
![](https://assets.st-note.com/img/1726458752-oYJFtmPIZzDuBWy5jaQULdgS.png?width=1200)
![](https://assets.st-note.com/img/1726458779-vjXdEh4rx2HGqFJMst7acwlN.png)
CSSを追加
![](https://assets.st-note.com/img/1726459012-jRXi9LgNKcdVHhSnQz82W6Ie.png?width=1200)
![](https://assets.st-note.com/img/1726458997-PHjGmZWY8BtbxN9ViA3IogCh.png?width=1200)
![](https://assets.st-note.com/img/1726458984-i675URIdNjsySgnTYpqmFAOe.png)
app.set テンプレートエンジンを使ってみる
動的ファイル表示もできる
データベースとか。
コンソールで
npm i ejs
viewsフォルダ作る
![](https://assets.st-note.com/img/1726459366-vRNhUoCi5aWj1su8x0grfk94.png)
index.ejs ファイル作る
![](https://assets.st-note.com/img/1726459457-ka6b3VSLI7p8HPCWn4liGqed.png?width=1200)
ターミナル
サーバ起動
npm run dev
server.js コメントアウトして、書き換え
![](https://assets.st-note.com/img/1726459573-GQWluAjZrOxpoU0MqmSNeB8H.png?width=1200)
![](https://assets.st-note.com/img/1726459648-kJ5leSbm6QDBVGYRtxWIyFq1.png?width=1200)
res.render("index",{text: "Node.jsとExpress"})
本来なら、この{}の部分がデータベースから取得してきたものになるが、まずはハードコーディング(手書き)で。
index.ejs書き換える
![](https://assets.st-note.com/img/1726459771-c46VArSqjZ7DeYps1f5vLUb0.png?width=1200)
![](https://assets.st-note.com/img/1726459781-8GtOEwJNBIu5TCUqYjgKpWiZ.png)
Hello <%= text %> として、呼び出す
![](https://assets.st-note.com/img/1726459883-XZW5sJSRdkpq8ribo0eh213K.png?width=1200)
text は {text: "Node.jsとExpress"}の部分が呼び出される
![](https://assets.st-note.com/img/1726459900-mcW4RKOfkyoVuXzx7Fs3BhjY.png?width=1200)
ブラウザ表示確認
![](https://assets.st-note.com/img/1726459931-esNqdLruwa7AFfbmgkxGpSt6.png)
VS Code ejsプラグイン
入れておこう
![](https://assets.st-note.com/img/1726459996-G8lHL4C6Vy9rKR5tXId2Mseg.png?width=1200)
ミドルウェア
//ミドルウェア
function mylogger(req, res, next){
console.log(req.originalURL);
next();
}
app.use(mylogger);
const express = require("express");
const app = express();
const userRouter = require("./routes/user");
const PORT = 3000;
app.use(mylogger);
// app.use(express.static("public"));
app.set("view engine", "ejs");
app.get("/", (req, res) => {
// console.log("Hello express");
// res.send("<h1>こんにちは</h1>");
// res.sendStatus(404);
// res.status(500).send("エラーです。");
// res.status(500).json({ msg: "エラーです。" });
res.render("index",{text: "Node.jsとExpress"})
});
//ルーティング
app.use("/user", userRouter);
// app.use("/auth", authRouter);
// app.use("/prooduct", productRouter);
//ミドルウェア
function mylogger(req, res, next){
console.log(req.originalUrl);
next();
}
app.listen(PORT, () => console.log("サーバーが起動しました。"));
ターミナル ルートディレクトリが表示される
![](https://assets.st-note.com/img/1726460892-UtqMupBRbJ38SzN5cQHe1irI.png?width=1200)
動画見ながら、ミドルウェアを効かしていく箇所の変更など。
今日はこんなとこで。
いいなと思ったら応援しよう!
![good-sun(a03)](https://assets.st-note.com/production/uploads/images/74915135/profile_e6435615735e2ec66a673a40d90bb4a5.png?width=600&crop=1:1,smart)