ExpressでSessionを使う(development環境)

この記事の続き
https://onsen3.blogspot.jp/2017/11/node.html

※Production環境でこのまま運用してはいけない。

導入

セッションを使ってサーバーにデータを一時保存するにはexpress-sessionを使う。
$ yarn add express-session

ドキュメントに書いてあるが、v1.5.0以前はcookie-parserも必要だったようだが、現在では不要である。
Note Since version 1.5.0, the cookie-parser middleware no longer needs to be used for this module to work.

index.js

import express from 'express'
import expressSession from 'express-session'

const app = express()
const session = expressSession({
  secret: 'keyboard cat', //何か入れる
  resave: false,
  saveUninitialized: false,
  cookie: {}
})
app.use(session)

saveUninitializedはtrueだと未初期化状態のセッションも保存するようになるが、未初期化状態のセッションを保存したい状況が分からないのでfalse。必要になったらtrueで。
cookieの設定はdevelopment段階なら空でも動く。
ただし、resaveをtrueにするならばsaveUninitializedもtrueにしなければならない。

使い方

express-sessionが導入できるとセッション情報をreq.sessionから扱えるようになる。
これは最初は空のオブジェクト{}。
したがって、下記のようにreq.sessionに値を格納するだけ。


app.get('/', (req, res) => {
  req.session.someValue = 1
})

簡素なログイン処理の例

app.get((req, res, next) => {
  console.log(req.session)
  if (!req.session.logined) {
    res.redirect('/login')
    return
  }
  // logined
  console.log('logined!')
  next()
})

req.session.loginedがfalsyなら/loginにリダイレクトするというミドルウェア。

Socket.ioとの併用

他ユーザーとのインタラクションが要るときはsocket.ioを使いたい。
expressとsocket.ioの連携は公式ドキュメントがあるが、express-sessionとのセッション連携がめんどくさい。
express-socket.io-sessionを使うとすごく楽。

$ yarn add express-socket.io-session

一応最小構成を書くと下記のようになる。
1ファイルにごちゃごちゃ書くとやばそうなので適宜分割したいところ。
import { createServer } from 'http'
import express from 'express'
import expressSession from 'express-session'
import sharedSession from 'express-socket.io-session'
import socketIo from 'socket.io'

const app = express()
const server = createServer(app)
const io = socketIo(server)
const session = expressSession({
  secret: 'keyboard cat',
  saveUninitialized: false,
  resave: false,
  cookie: {}
})

app.use(session)
io.use(sharedSession(session, {
  autoSave: true
}))

コメント

このブログの人気の投稿

ぷよぷよ 4つの戦法

LLR

ぷよぷよ 先折り階段を組む時に考えたこと