1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Node.js Express】Node.js Expressアプリケーションにフラッシュメッセージを実装する方法

Last updated at Posted at 2020-12-20

※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。

フラッシュメッセージを使うには、connect-flash パッケージを用います。
フラッシュメッセージはリクエスト間で渡されるため、セッションとクッキーに依存します。

よって下記の3つのインストールが必要となります。

npm i connect-flash cookie-parser express-session -S

インストールしたモジュールをロードし、設定します。

main.js
"use strict";

//モジュールロード
const express = require("express"),
  app = express(),
  router = express.Router(),
  expressSession = require("express-session"),
  cookieParser = require("cookie-parser"),
  connectFlash = require("connect-flash"),

//cookie-parserをミドルウェアとして設定
router.use(cookieParser("secret_passcode"));

//express-sessionをミドルウェアとして設定
router.use(
  expressSession({
    secret: "secret_passcode",
    cookie: {
      maxAge: 4000000
    },
    resave: false,
    saveUninitialized: false
  })
);

//connect-flashをミドルウェアとして設定
router.use(connectFlash());

//フラッシュメッセージをresのローカル変数のflashMessagesに代入 ※1
router.use((req, res, next) => {
  res.locals.flashMessages = req.flash();
  next();
});

express-sessionについてはこちらも参考
【Node.js express】express-validatorでバリデーションを実装し、通過した値をセッションに格納する。

コントローラーにフラッシュメッセージの処理を組み込み(Userモデルcreateの例)

usersController.js

module.exports = {
  create: (req, res, next) => {
    let userParams =  {
      name: req.body.name,
      email: req.body.email,
    };
    User.create(userParams)
      .then(user => {
        req.flash("success", "account created successfully!");
        res.redirect("users"); //上記の※1ミドルウェアを経由する。
        //success型
      })
      .catch(error => {
        req.flash("error", `Failed ${error.message}.`); //セッションを経由して表示
        res.redirect("users/new"); //フォームに戻す//上記の※1ミドルウェアを経由する。
        //error型
      });
  },
};

ビュー側でフラッシュメッセージを組み込み

layout.ejs
	<div class="flashes">
          <% if (flashMessages) { %>  //flashMessagesがあった場合
           <% if (flashMessages.success) { %> //success型があった場合
             <div class="flash success">
	       <%= flashMessages.success %>
	     </div>
           <% } else if (flashMessages.error) { %> //error型があった場合
	     <div class="flash error">
	       <%= flashMessages.error %>
	     </div>
	   <% } %>
	 <% } %>
	</div>
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?