Node.js+Expressでログイン機能をつくる
インストール
ログイン機能をつくるためにはログイン情報をセッションという箱に入れておく必要があります。
そのために、express-sessionというモジュールをインストールします。
npm install express-session
express-sessionを使う準備【app.js】
const session = require('express-session');
app.use(
session({
secret: 'my_secret_key',
resave: false,
saveUninitialized: false,
})
);
ログイン画面へのルーティング【app.js】
app.get('/login', (req,res) => {
res.render('login.ejs');
});
ログイン画面の作成【views/login.ejs】
<form action='/login' method='post'>
<input type='text' name='email'>
<input type='password' name='password'>
<input type='submit' value='ログイン'>
</form>
フォームデータを受け取る【app.js】
データベースからユーザー情報が見つかった場合は、それをセッションという箱に格納します
app.post('/login', (req,res) => {
connection.query(
'SELECT * FROM users WHERE email = ?',
[req.body.email],
(error, results) => {
if(results.length > 0){
/
if(req.body.password === results[0].password){
console.log('認証に成功しました');
req.session.userId = results[0].id;
req.session.username = results[0].username;
res.redirect('/');
} else {
console.log('認証に失敗しました');
res.redirect('/login');
}
} else {
res.redirect('/login');
}
}
);
});
セッション情報からデータを読み出す
・app.use内の処理は全てのリクエスト(app.getやapp.post)の前に実行されます
・app.userからEJSファイルに直接値を渡すためには、res.localsを使う
app.use( (req, res, next) => {
if (req.session.userId === undefined){
console.log('ログインしていません');
res.locals.username = 'ゲスト';
} else {
console.log('ログインしています');
res.locals.username = req.session.username;
}
// 次の処理に移動
next();
});
localsオブジェクトから値を取得する
<p>ようこそ、<%= locals.username %>さん</p>
ログアウト機能
セッション情報を削除する
app.get('/logout', (req,res) => {
req.session.destroy( (error) => {
// セッション情報を削除した後の処理
res.redirect('/');
});
});