質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

1782閲覧

ログイン時にヘッダーメニューの内容を変更したい

maskmelon

総合スコア63

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/08/03 14:45

Node.jsとExpressを使ってログイン認証機能を実装しています。

ログイン判定時に画面上部のヘッダーにマイページとログアウトのリンクが出るようにしたいです。

テンプレートエンジン(hbs)を使っているので、header.hbsの内部でif文を使って分岐させればよいと思うのですが、クライアント側からログイン判定をする方法がわかりません。

ログイン認証にはPassport.jsのローカルストラテジを使用しています。

アドバイスを頂けると嬉しいです。

JavaScript

1const express = require('express'); 2const path = require('path'); 3require('./db/mongoose'); 4const hbs = require('hbs'); 5const session = require('express-session'); 6const passport = require('passport'); 7 8const app = express(); 9const port = process.env.PORT || 3000; 10 11const publicDirectoryPath = path.join(__dirname, '../public'); 12const viewsPath = path.join(__dirname, '../templates/views'); 13const partialsPath = path.join(__dirname, '../templates/partials'); 14 15const User = require('./models/userModel'); 16 17app.set('view engine', 'hbs'); 18app.set('views', viewsPath); 19hbs.registerPartials(partialsPath); 20 21app.use(express.static(publicDirectoryPath)); 22app.use(express.json()); 23app.use(express.urlencoded({ extended: true })); 24 25app.use(session({ 26 secret: 'hogehoge', 27 resave: false, 28 saveUninitialized: false, 29})); 30 31app.use(passport.initialize()); 32app.use(passport.session()); 33 34passport.use(User.createStrategy()); 35 36passport.serializeUser(User.serializeUser()); 37passport.deserializeUser(User.deserializeUser()); 38 39app.listen(port, () => { 40 console.log(`Server is up on port${port}`); 41}); 42 43app.get('/', (req, res) => { 44 res.render('home'); 45}); 46 47app.get('/register', (req, res) => { 48 res.render('register'); 49}); 50 51app.get('/login', (req, res) => { 52 res.render('login'); 53}); 54 55app.get('/home', (req, res) => { 56 if (req.isAuthenticated()) { 57 res.render('home'); 58 } else { 59 res.redirect('/init'); 60 } 61}); 62 63app.post('/register', async (req, res) => { 64 const { username, gender } = req.body; 65 66 try { 67 await User.register({ username, gender }, req.body.password); 68 } catch (e) { 69 res.status(400).send(e); 70 } 71 72 passport.authenticate('local')(req, res, () => { 73 res.render('home'); 74 }); 75}); 76 77app.post('/login', async (req, res) => { 78 const user = new User(req.body); 79 80 req.login(user, (err) => { 81 if (err) { 82 res.status(400).send(); 83 } else { 84 passport.authenticate('local')(req, res, () => { 85 res.render('home'); 86 }); 87 } 88 }); 89}); 90

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

JavaScript

1const auth = (req, res, next) => { 2 if (!req.isAuthenticated()) { 3 res.locals.loginState = false; 4 res.render('init'); 5 return; 6 } 7 res.locals.loginState = true; 8 next(); 9}; 10 11module.exports = auth; 12

hbs

1<ul class="navbar-nav ml-auto"> 2 {{#if loginState}} 3 <li class="nav-item"> 4 <a class="nav-link" href="/profile">プロフィール</a> 5 </li> 6 <li class="nav-item"> 7 <a class="nav-link" href="/logout">ログアウト</a> 8 </li> 9 {{else}} 10 <li class="nav-item"> 11 <a class="nav-link" href="/register">新規登録</a> 12 </li> 13 <li class="nav-item"> 14 <a class="nav-link" href="/login">ログイン</a> 15 </li> 16 {{/if}} 17</ul>

ログイン判定用のミドルウェアを作成して、res.locals変数にログイン状態を保存することで、view側からログイン状態を参照することができました。

投稿2020/08/17 15:47

maskmelon

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問