こんにちは、なかにしです。
今回はフォームについてやっていきます。
前回はGetのみだったので、Postもガンガン使ってくよ~
POSTの受け取り方
簡単です。
「request.method」にリクエスト情報が入るので、
それがGETかPOSTかで処理を分けてあげればOKです。
フォームを作る
<!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>
    <form method="post" action="/form">
      <h2>これはフォームです。</h2>
      <label for="name">名前</label>
      <input type="text" id="name" name="name">
      <input type="submit" value="Go!!" />
    </form>
  </body>
</html>雑なフォームを作りました。
名前を入力すると、「/form」に「POST」でアクセスします。
Node側も変更します。
const http = require("http");
const fs = require("fs");
const ejs = require("ejs");
// ejsを読み込む
const template = fs.readFileSync("./sample.ejs", "utf-8");
// ルーティングに対して表示するものを書く
const routes = {
  "/": {
    title: "こんちわ~",
  },
  "/form": {
    title: "Nice Submit!!",
  },
  "/get": {
    title: "Getで来るなや",
  },
};
// サーバーを作る
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,
      });
      writeContent(200);
      break;
    case "/form":
      if (request.method === "POST") {
        content = ejs.render(template, {
          title: routes[url].title,
        });
        writeContent(200);
        break;
      } else {
        content = ejs.render(template, {
          title: routes["/get"].title,
        });
        writeContent(200);
        break;
      }
    default:
      content = ejs.render(template, {
        title: "Page Not Found",
      });
      writeContent(404);
      break;
  }
});
// サーバーを8080で起動
server.listen(8080);前回とほぼ同じですが、「/form」「/get」というルーティングを追加しました。
POSTで「/form」に来たときは「Nice Submit!!」を表示、
GETで「/form」に来たときは「Getで来るなや」とガチギレします。
動作確認
値を受け取って表示
POSTで受け取った値を表示します。
とりあえず表示する用の「content」変数を作ります。
<!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>
    <form method="post" action="/form">
      <h2>これはフォームです。</h2>
      <label for="name">名前</label>
      <input type="text" id="name" name="name">
      <input type="submit" value="Go!!" />
    </form>
  </body>
</html>server.jsも修正します。
POSTで来た値を処理する為、「querystring」というのを使用します。
const http = require("http");
const fs = require("fs");
const ejs = require("ejs");
const qs = require("querystring");
// ejsを読み込む
const template = fs.readFileSync("./sample.ejs", "utf-8");
// ルーティングに対して表示するものを書く
const routes = {
  "/": {
    title: "こんちわ~",
    content: "なんもないよ",
  },
  "/form": {
    title: "Nice Submit!!",
    content: "",
  },
  "/get": {
    title: "Getで来るなや",
    content: "帰れ!!",
  },
};
// サーバーを作る
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 "/form":
      if (request.method === "POST") {
        let body = "";
        request.on("data", function (data) {
          body += data;
        });
        request.on("end", function () {
          const post = qs.parse(body);
          content = ejs.render(template, {
            title: routes[url].title,
            content: post.name,
          });
          writeContent(200);
        });
        break;
      } else {
        content = ejs.render(template, {
          title: routes["/get"].title,
          content: routes["/get"].content,
        });
        writeContent(200);
        break;
      }
    default:
      content = ejs.render(template, {
        title: "Page Not Found",
        content: "見せられるものはない!",
      });
      writeContent(404);
      break;
  }
});
// サーバーを8080で起動
server.listen(8080);
ざっくり解説すると、
POSTで来た値を「request.on(“data”)」で取得し、
それを「querystring」でパース。
取り出した中身をcontentとして突っ込み、テンプレートで表示。
といった感じです。
動作確認
いいかんじ!



