next.jsの軽量約束ベースのセッションミドルウェアまた、microまたはnode.js HTTPサーバー、Expressなどで動作します。
また、Next-Iron-Sessionなどの代替品をご覧ください。 NextJS-Mongodb-Appをご覧になって、このモジュールが使用されていることを確認してください。
// NPM
npm install next-session
// Yarn
yarn add next-sessionv1.xからv2.xにアップグレードしますか?ここでリリースノートを読んでください!
v2.xからv3.xにアップグレードしますか?ここでリリースノートを読んでください!
v3.xからv4.xにアップグレードしますか?ここでリリースノートを読んでください!
警告デフォルトのセッションストア( options?.storeがundefined場合)、 MemoryStoreは、生産またはサーバーレス環境では機能しません。セッションストアを使用する必要があります。
// ./lib/get-session.js
import nextSession from "next-session" ;
export const getSession = nextSession ( options ) ; import { getSession } from "./lib/get-session.js" ;
export default function handler ( req , res ) {
const session = await getSession ( req , res ) ;
session . views = session . views ? session . views + 1 : 1 ;
// Also available under req.session:
// req.session.views = req.session.views ? req.session.views + 1 : 1;
res . send (
`In this session, you have visited this website ${ session . views } time(s).`
) ;
} APIルートでの使用によりAPI resolved without sending a response場合があります。これは、以下を追加することで解決できます。
import nextSession from "next-session" ;
const getSession = nextSession ( ) ;
export default function handler ( req , res ) {
const session = await getSession ( req , res ) ;
/* ... */
}
export const config = {
api : {
externalResolver : true ,
} ,
} ; ...またはoptions.autoCommitをfalseに設定し、 await session.commit() 。
import nextSession from "next-session" ;
const getSession = nextSession ( { autoCommit : false } ) ;
export default function handler ( req , res ) {
const session = await getSession ( req , res ) ;
/* ... */
await session . commit ( ) ;
} import { getSession } from "./lib/get-session.js" ;
export default function Page ( { views } ) {
return (
< div > In this session, you have visited this website { views } time(s). </ div >
) ;
}
export async function getServerSideProps ( { req , res } ) {
const session = await getSession ( req , res ) ;
session . views = session . views ? session . views + 1 : 1 ;
// Also available under req.session:
// req.session.views = req.session.views ? req.session.views + 1 : 1;
return {
props : {
views : session . views ,
} ,
} ;
}Express、次の接続
const express = require ( "express" ) ;
const app = express ( ) ;
app . use ( async ( req , res , next ) => {
await getSession ( req , res ) ; // session is set to req.session
next ( ) ;
} ) ;
app . get ( "/" , ( req , res ) => {
req . session . views = req . session . views ? req . session . views + 1 : 1 ;
res . send (
`In this session, you have visited this website ${ req . session . views } time(s).`
) ;
} ) ;マイクロ、Vercel ServerLess関数
module . exports = ( req , res ) => {
const session = await getSession ( req , res ) ;
res . end (
`In this session, you have visited this website ${ session . views } time(s).`
) ;
} ;node.js HTTPサーバー
const http = require ( "http" ) ;
const server = http . createServer ( async ( req , res ) => {
const session = await getSession ( req , res ) ;
res . end ( `In this session, you have visited this website ${ session . views } time(s).` ;
} ) ;
server . listen ( 8080 ) ; next-session以下のプロパティを受け入れます。
| オプション | 説明 | デフォルト |
|---|---|---|
| 名前 | リクエストから読み、応答に設定するCookieの名前。 | sid |
| 店 | 使用するセッションストアインスタンス。生産で働くために必要です! | MemoryStore |
| 遺伝子 | 新しいセッションIDの文字列を生成する関数。 | nanoid |
| エンコード | Cookieを設定する前に、セッションIDを変換します。生のセッションIDを取得し、デコード/復号化されたセッションIDを返します。 | 未定義 |
| デコード | Cookieから取得中にセッションIDを戻します。エンコード/暗号化されたセッションIDを返す必要があります | 未定義 |
| タッチャフター | 最後のアクセスから(秒単位)後にのみタッチします。デフォルトで無効または-1に設定されている場合。 Tackafterを参照してください。 | -1 (無効) |
| オートコンミット | セッションを自動的にコミットします。手動でsession.commit()使用する場合は、これを無効にします | true |
| Cookie.secure | Secure Set-Cookie属性のブール値を指定します。 | false |
| cookie.httponly | httponly Set-Cookie属性のブール値を指定します。 | true |
| cookie.path | PATH Set-Cookie属性の値を指定します。 | / |
| cookie.domain | Domain Set-Cookie属性の値を指定します。 | 解き放つ |
| cookie.samesite | Samesite Set-Cookie属性の値を指定します。 | 解き放つ |
| cookie.maxage | (秒単位)最大時代のSet-Cookie属性の値を指定します。 | Unset(ブラウザセッション) |
Touchingとは、アクセス時にブラウザ(Set-CookieヘッダーのExpires期限を変更する)とセッションストア(それぞれの方法を使用)の両方で、セッションのライフタイムの拡張を指します。これにより、セッションがしばらくすることができなくなります。
autoCommit Mode(デフォルトで有効になっている)では、最適化のために、セッションが変更されていない場合は保存されずにのみ触れられます。 touchAfterの値を使用すると、セッションがまだ最近の場合はタッチをスキップでき、したがってデータベースの負荷が減少します。
すべてのリクエストでCookieをエンコード/デコードまたは暗号化/復号化するカスタム機能のペアを提供できます。
// `express-session` signing strategy
const signature = require ( "cookie-signature" ) ;
const secret = "keyboard cat" ;
session ( {
decode : ( raw ) => signature . unsign ( raw . slice ( 2 ) , secret ) ,
encode : ( sid ) => ( sid ? "s:" + signature . sign ( sid , secret ) : null ) ,
} ) ; これにより、現在のセッションに関連付ける特定の値を設定または取得できます。
// Set a value
if ( loggedIn ) session . user = "John Doe" ;
// Get a value
const currentUser = session . user ; // "John Doe" Maxageでセッションの有効期限を手動で拡張します。注: autoCommit = falseの場合、session.commit()を呼び出す必要があります。
session . touch ( ) ; touchAfter非陰性の値で設定されている場合、これはそれに応じて自動的に呼び出されます。
現在のセッションを破壊し、セッションストアから削除します。
if ( loggedOut ) await session . destroy ( ) ;セッションを保存して、ネクサリーヘッダーを設定します。約束を返します。ヘッダー( res.writeHead )または応答( res.send 、 res.endなど)を送信する前に呼び出さなければなりません。
autoCommitがfalseに設定されている場合は、これを呼び出す必要があります。
session . hello = "world" ;
await session . commit ( ) ;
// always calling res.end or res.writeHead after the above現在のセッションに関連付ける一意のID。
セッションミドルウェアに使用するセッションストア(上記のoptionsを参照)。
互換性のあるセッションストアには、 set(sid, session) 、 get(sid) 、およびdestroy(sid) 3つの機能を含める必要があります。関数touch(sid, session)をお勧めします。すべての機能は約束を返す必要があります。
メモリストアを参照してください。
タイプスクリプト: SessionStoreタイプを使用して実装を支援できます。
import type { SessionStore } from "next-session" ;
class CustomStore implements SessionStore { }Express/Connectストアを使用するには、 util.promisifyを使用して、 get 、 set 、 destroy 、および(存在する場合) touchメソッドを約束する必要があります。
next-session/lib/compat util promisifyStoreを次のようにします。
import nextSession from "next-session" ;
import { promisifyStore } from "next-session/lib/compat" ;
import SomeConnectStore from "connect-xyz" ;
const connectStore = new SomeConnectStore ( ) ;
const getSession = nextSession ( {
store : promisifyStore ( connectStore ) ,
} ) ; Connectストアに次のパターンがある場合はnext-session/lib/compatのexpressSession使用できます。
const session = require ( "express-session" ) ;
const RedisStore = require ( "connect-redis" ) ( session ) ;
// Use `expressSession` from `next-session/lib/compat` as the replacement
import nextSession from "next-session" ;
import { expressSession , promisifyStore } from "next-session/lib/compat" ;
import RedisStoreFactory from "connect-redis" ;
import Redis from "ioredis" ;
const RedisStore = RedisStoreFactory ( expressSession ) ;
export const getSession = nextSession ( {
store : promisifyStore (
new RedisStore ( {
client : new Redis ( ) ,
} )
) ,
} ) ; 私の寄稿者をご覧ください。md。
mit