Express
が初めてです。なので Express 4.x
はバンドルされたミドルウェアを削除しました。使用したいミドルウェアが必要です。 githubでREADMEと express-session および cookie-session を読んだとき、違いを理解するのは難しいと感じています。
それで、私はそれを理解するために簡単なコードを書きます。ミドルウェアごとに2回実行します。
var express = require('express')
, cookieParser = require('cookie-parser')
, session = require('cookie-session')
, express_sess = require('express-session')
, app = express();
app.use(cookieParser())
app.use(session({ keys: ['abc'], name: 'user' }));
//app.use(express_sess({ secret: 'abc', key: 'user'}));
app.get('/', function (req, res, next) {
res.end(JSON.stringify(req.cookies));
console.log(req.session)
console.log(req.cookies)
});
app.listen(3000);
にとって cookie-session
、端末には常に{}が表示されます。
にとって express-session
、私はこのようなものを得る。
req.session: { cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}
req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
それは本当に私を混乱させます。では、基本的な使用方法で結果を説明する方法は?そして、それらの違いは何ですか?いつ使用するべきですか?
基本的に、 express-session
はより抽象的で、さまざまなセッションストア(ファイル、DB、キャッシュなど)をサポートします。
そしてcookie-session
は、シンプルで軽量なCookieベース(Cookieがサポートされる唯一のストレージエンジンです。すべてのセッション情報は、Cookie内のクライアントに保存されます)セッション実装です。この種のセッションは、おそらく Rails実装 で最も有名です。
これらの両方の基本的な違いは、セッションデータがどのように、どこに保存されるかに関するものです。 Cookieセッションは基本的に、セッションデータがCookieに格納されているがclient [ブラウザ]内にある軽量セッションアプリケーションに使用されます。一方、Express Sessionは、クライアント側のCookie内に単なるセッションIDを保存するだけで、セッションデータをサーバー上に完全に保存します。 Cookieセッションは、バックエンドでデータベースが使用されていないアプリケーションで役立ちます。ただし、セッションデータはCookieのサイズを超えることはできません。データベースが使用される条件では、キャッシュのように機能し、頻繁なデータベース検索を停止しますが、これは高価です。
express-session
はセッション識別子をCookieに保存しますが、実際のセッションデータはconnect-redis
のようなバックエンドセッションストアに存在します。ここで、cookie-session
はセッションデータをCookie(クライアント側)に保存できます。
cookie-session
のドキュメントから:
ユーザーセッションは、主に2つの方法でCookieを使用して保存できます。サーバー上またはクライアント上です。このモジュールは、セッションデータをCookie内のクライアントに保存しますが、エクスプレスセッションのようなモジュールは、Cookie内のクライアントにセッション識別子のみを保存し、セッションデータをサーバー(通常はデータベース)に保存します。
cookie-session
を使用する主な利点は、クラスター化されたnode.js
アプリがある場合、分岐したプロセス間でセッションデータを共有することに依存する必要がないことです。
私が見つけた重要な違いを共有させてください:安全なクッキー。
SSLを処理するnginxプロキシの背後にノードプロセスがあります。
Express-sessionで試しましたが、セキュアCookieを有効にできませんでした。 issue here を参照してください。
それから私はほとんど同じコードで試しましたが、代わりにcookie-sessionで
_ const expressSession = require('cookie-session')
var expiryDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days
const session = expressSession({
secret: sessionSecret,
resave: false,
saveUninitialized: true,
cookie: {
secureProxy: true,
httpOnly: true,
domain: 'example.com',
expires: expiryDate
}
})
app.use(session)
_
私はちょうどrequire('express-session')
をrequire('cookie-session')
に変更し、_secureProxy: true,
_を追加しました:すべてが箱から出して動作しました。
また、両方のパッケージが expressjs によって維持されていることに注意してください。そのため、おそらく私の使用例では、cookie-sessionがニーズに合っていることがわかりました。
v4-> cookie-sessionは(-cookieベースのセッションを確立します。)等しい-> v3 express.cookieSession
v4-> express-sessionは(サーバーベースのセッションを確立する(開発のみ))。 -> v3 express.sessionに等しい
ロギングの前にセッション値を設定する必要がある空でないconsole.log(req.session)を取得します。
Cookie-sessionリポジトリから( https://github.com/expressjs/cookie-session ):
app.get('/', function (req, res, next) {
req.session.views = (req.session.views || 0) + 1
console.log(req.session)
res.end(req.session.views + ' views')
})
Req.sessionオブジェクトに情報を設定したことがない場合、空を返します。