Node.jsでEJSテンプレートエンジンを使用する

EJSとは

EJS(Embedded JavaScript)は、HTMLページ内でJavaScriptコードを実行できるテンプレートエンジンです。サーバーサイドで動的なHTMLページを生成する際に使用されます。

EJSファイルの設定

EJSテンプレートファイルの拡張子は.htmlではなく.ejsを使用します。変数を出力するには以下の構文を使用します:

<%- 変数名 %>
<%= 変数名 %>

Node.jsでのEJS設定

まず、EJSパッケージをインストールします:

npm install ejs

ExpressアプリケーションでEJSを設定します:

const express = require("express");
const app = express();

app.set("view engine", "ejs");
app.set("views", "./views");

テンプレートのレンダリング

テンプレートにデータを渡してレンダリングします:

res.render("templateName", {
    data: "渡すデータ"
});

実践例:ユーザー登録・ログイン機能

データベース接続

const mongoose = require("mongoose");

mongoose.connect("mongodb://127.0.0.1:27017/userdb", {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).then(() => {
    console.log("データベース接続成功");
}).catch(err => {
    console.error("接続エラー:", err);
});

スキーマ定義

const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
    loginId: {
        type: String,
        unique: true,
        required: true
    },
    loginPass: {
        type: String,
        required: true
    },
    createdAt: {
        type: Date,
        default: Date.now
    }
});

const UserModel = mongoose.model("users", userSchema);
module.exports = UserModel;

サーバー実装

const express = require("express");
const path = require("path");
const UserModel = require("./models/user");

const app = express();
app.listen(3000, () => {
    console.log("サーバー起動: port 3000");
});

app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));

app.use(express.static(path.join(__dirname, "public")));
app.use(express.urlencoded({ extended: true }));

const errorPage = path.join(__dirname, "views/error.ejs");

// 登録ルート
app.post("/register", async (req, res) => {
    const { loginId, loginPass } = req.body;

    if (!loginId || !loginPass) {
        return res.render(errorPage, {
            message: "ユーザー名とパスワードを入力してください"
        });
    }

    const existingUser = await UserModel.findOne({ loginId });
    if (existingUser) {
        return res.render(errorPage, {
            message: "このユーザーは既に存在します"
        });
    }

    const formatCheck = /^[a-zA-Z0-9_]{6,12}$/;
    if (!formatCheck.test(loginId) || !formatCheck.test(loginPass)) {
        return res.render(errorPage, {
            message: "形式が正しくありません(英数字6〜12文字)"
        });
    }

    try {
        await UserModel.create({
            loginId,
            loginPass
        });
        res.redirect("/login.html");
    } catch (error) {
        res.render(errorPage, {
            message: "サーバーエラーが発生しました"
        });
    }
});

// ログインルート
app.post("/login", async (req, res) => {
    const { loginId, loginPass } = req.body;

    if (!loginId || !loginPass) {
        return res.render(errorPage, {
            message: "入力してください"
        });
    }

    const user = await UserModel.findOne({ loginId, loginPass });
    
    if (user) {
        res.redirect("/dashboard.html");
    } else {
        res.render(errorPage, {
            message: "ユーザー名またはパスワードが正しくありません"
        });
    }
});

エラーテンプレート(error.ejs)

<!DOCTYPE html>
<html>
<head>
    <title>エラー</title>
</head>
<body>
    <h1>エラーが発生しました</h1>
    <p><%- message %></p>
    <a href="/">ホームに戻る</a>
</body>
</html>

まとめ

EJSを使用することで、サーバーサイドで動的なデータをHTMLテンプレートに埋め込み、レスポンスとしてクライアントに返すことができます。Expressと組み合わせることで、効率的なWebアプリケーション開発が可能です。

タグ: ejs nodejs express MongoDB javascript

5月20日 09:53 投稿