Leichtes Versprechen-basiertes Session Middleware für Next.js. Funktioniert auch in Micro oder Node.js HTTP Server, Express und mehr.
Schauen Sie sich auch Alternativen wie die nächste Eisensitzung an. Schauen Sie sich NextJS-Mongodb-App an, um dieses Modul zu sehen.
// NPM
npm install next-session
// Yarn
yarn add next-sessionUpgrade von v1.x auf v2.x? Bitte lesen Sie die Versionshinweise hier!
Upgrade von v2.x auf v3.x? Bitte lesen Sie die Versionshinweise hier!
Upgrade von v3.x auf v4.x? Bitte lesen Sie die Versionshinweise hier!
Warnung des Standard MemoryStore ( undefined options?.store Sie müssen einen Sitzungsgeschäft verwenden.
// ./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).`
) ;
} Die Verwendung in API -Routen kann dazu führen, dass API resolved without sending a response . Dies kann durch beiden Hinzufügen gelöst werden:
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 ,
} ,
} ; await session.commit() oder false options.autoCommit
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, Next-Connect
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).`
) ;
} ) ;Micro, Vercel Serverlose Funktionen
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 Server
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 akzeptiert die folgenden Eigenschaften.
| Optionen | Beschreibung | Standard |
|---|---|---|
| Name | Der Name des Cookie, der aus der Anfrage gelesen und auf die Antwort festgelegt wird. | sid |
| speichern | Die Session Store -Instanz wird verwendet. Erforderlich, um in der Produktion zu arbeiten! | MemoryStore |
| Genid | Die Funktion, die eine Zeichenfolge für eine neue Sitzungs -ID generiert. | nanoid |
| kodieren | Transformiert die Sitzungs -ID vor dem Einstellen von Cookie. Die RAW -Sitzungs -ID benötigt und gibt die dekodierte/entschlüsselte Sitzungs -ID zurück. | undefiniert |
| dekodieren | Transformiert die Sitzungs -ID zurück, während er vom Cookie kommt. Es sollte die codierte/verschlüsselte Sitzungs -ID zurückgeben | undefiniert |
| Berührung | Berühren Sie erst nach letztem Zugriff nach einer Zeit (in Sekunden) . Standardmäßig deaktiviert oder auf -1 festgelegt. Siehe Berührung. | -1 (deaktiviert) |
| Autokommit | Automatisch Sitzung begehen. Deaktivieren Sie dies, wenn Sie manuell session.commit() | true |
| Cookie.Secure | Gibt den Booleschen Wert für das Secure Set-Cookie -Attribut an. | false |
| Cookie.httponly | Gibt den Booleschen Wert für das Attribut httponly Set-Cookie . | true |
| Cookie.Path | Gibt den Wert für das Path Set-Cookie -Attribut an. | / |
| Cookie.domain | Gibt den Wert für das Domain Set-Cookie -Attribut an. | ungehindert |
| Cookie.Samesit | Gibt den Wert für das Set-Cookie -Attribut für Samesit Set-Cookie an. | ungehindert |
| Cookie.maxage | (in Sekunden) Gibt den Wert für das Set-Cookie Attribut des max-Alters an. | Uneinig (Browsersitzung) |
Berühren bezieht sich auf die Erweiterung der Sitzungsdauer, sowohl im Browser (durch Änderung Expires das Attribut des Set-Cookie-Headers) als auch im Sitzungsspeicher (mit seiner jeweiligen Methode) beim Zugriff. Dies verhindert, dass die Sitzung nach einer Weile abgelaufen ist.
Im autoCommit -Modus (der standardmäßig aktiviert ist) wird für die Optimierung nur eine Sitzung berührt und nicht gespeichert, wenn sie nicht geändert wird. Der Wert von touchAfter ermöglicht es Ihnen, Touching zu überspringen, wenn die Sitzung noch neu ist, und senkt somit die Datenbanklast.
Sie können ein benutzerdefiniertes Funktionspaar angeben, das den Cookie auf jede Anfrage codieren/dekodieren oder verschlüsseln/entschlüsselt .
// `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 ) ,
} ) ; Auf diese Weise können Sie einen bestimmten Wert festlegen oder erhalten , der der aktuellen Sitzung in Verbindung stellt.
// Set a value
if ( loggedIn ) session . user = "John Doe" ;
// Get a value
const currentUser = session . user ; // "John Doe" Erweitert manuell die Sitzungsablauf durch Maxage. HINWEIS: Sie müssen immer noch Sitzung anrufen autoCommit = false
session . touch ( ) ; Wenn touchAfter mit einem nicht negativen Wert festgelegt wird, wird dies automatisch entsprechend aufgerufen.
Zerstören Sie zur aktuellen Sitzung und entfernen Sie es aus dem Sitzungsgeschäft.
if ( loggedOut ) await session . destroy ( ) ; Speichern Sie die Sitzung und setzen Sie neccessary Header. Rückversprechen. Es muss vor dem Senden der Header ( res.writeHead ) oder der Antwort ( res.send , res.end usw.) aufgerufen werden.
Sie müssen dies nennen, wenn autoCommit auf false eingestellt ist.
session . hello = "world" ;
await session . commit ( ) ;
// always calling res.end or res.writeHead after the aboveDie eindeutige ID, die der aktuellen Sitzung assoziiert.
Der Session Store soll für Session Middleware verwendet werden (siehe options oben).
Ein kompatibler Sitzungsgeschäft muss drei Funktionen enthalten: set(sid, session) , get(sid) und destroy(sid) . Die Funktionsberührung touch(sid, session) wird empfohlen. Alle Funktionen müssen Versprechen zurückgeben.
Siehe MemoryStore.
TypeScript: Der SessionStore -Typ kann zur Unterstützung der Implementierung verwendet werden:
import type { SessionStore } from "next-session" ;
class CustomStore implements SessionStore { } Um Express/Connect -Stores zu verwenden, müssen Sie get , set , destroy und (falls vorhanden) touch verärgern, möglicherweise mit util.promisify .
Wir haben den Util- promisifyStore in next-session/lib/compat um genau das zu tun:
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 ) ,
} ) ; Sie können expressSession von next-session/lib/compat verwenden, wenn der Connect Store das folgende Muster hat.
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 ( ) ,
} )
) ,
} ) ; Bitte beachten Sie meinen Beitrag.md.
MIT