こんにちは、なかにしです。
シングルページの表示はできるようになったので、
今度はルーティングを組んでいきまっせ~
ざっくり仕組みを解説
今回は同じテンプレートを使用し、
ルーティングによって表示されるものが変わる、というのをやります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>
<%= title %>
</h1>
<p>
<%= content %>
</p>
</body>
</html>
この「titile」「content」部分をルーティングによって変えていきます。
ざっくりの仕組みとしては、
①「/」のとき表示する用のオブジェクト、
「/sample2」のとき表示するオブジェクトを作る
②ページに訪れた時のurl(/や/sample)を獲得する
③獲得したurlによってrenderの中身を変更
言葉で説明しても伝わりにくいので、やってみます!
server.jsを修正
const http = require("http");
const fs = require("fs");
const ejs = require("ejs");
// ejsを読み込む
const template = fs.readFileSync("./sample.ejs", "utf-8");
// ルーティングに対して表示するものを書く
const routes = {
"/": {
title: "サンプル1です。",
content: "サンプル1のコンテンツです。",
},
"/sample2": {
title: "サンプル2です。",
content: "サンプル2のコンテンツです。",
},
};
// サーバーを作る
const server = http.createServer();
// サーバーに対して何をするか書く
server.on("request", function (request, response) {
// URLを取得
const url = request.url;
// URLオブジェクトのpathname(/や/sample)でrenderの中身を変更
const html = ejs.render(template, {
title: routes[url].title,
content: routes[url].content,
});
response.writeHead(200, { "content-Type": "text/html" });
response.write(html);
response.end();
});
// サーバーを8080で起動
server.listen(8080);
「request.url」でルーティングを取得し、renderの内容を変えています。
「/」で来たときは route[“/”].title で「サンプル1です。」が表示、
「/sample2」で来たときは route[“sample2”].title で「サンプル2です。」が表示
といった仕組みです。
確認↓
これでルーティング完了…というわけではなく、
実は「/」「/sample2」以外のルーティングを指定するとエラーが出ます。
これに対処して完了です!
「/」「/sample2」以外のルーティングに対処
Switchで分けます。以上。
const http = require("http");
const fs = require("fs");
const ejs = require("ejs");
// ejsを読み込む
const template = fs.readFileSync("./sample.ejs", "utf-8");
// ルーティングに対して表示するものを書く
const routes = {
"/": {
title: "サンプル1です。",
content: "サンプル1のコンテンツです。",
},
"/sample2": {
title: "サンプル2です。",
content: "サンプル2のコンテンツです。",
},
};
// サーバーを作る
const server = http.createServer();
// サーバーに対して何をするか書く
server.on("request", function (request, response) {
// URLを取得
const url = request.url;
// codeを決めて中身を書く
const writeContent = (code) => {
response.writeHead(code, { "content-Type": "text/html" });
response.write(content);
response.end();
};
let content = "";
switch (url) {
case "/":
content = ejs.render(template, {
title: routes[url].title,
content: routes[url].content,
});
writeContent(200);
break;
case "/sample2":
content = ejs.render(template, {
title: routes[url].title,
content: routes[url].content,
});
writeContent(200);
break;
default:
content = ejs.render(template, {
title: "Page Not Found",
content: "ページが見つかりませんでした。ごめん。",
});
writeContent(404);
break;
}
});
// サーバーを8080で起動
server.listen(8080);
ちゃんと想定外のルーティングのときは「404」を返すように変えました。
オワリ!
次はフォームやるよ~