Middleware sesi berbasis janji ringan untuk Next.js. Juga berfungsi di Micro atau Node.js HTTP Server, Express, dan banyak lagi.
Lihat juga alternatif seperti sesi besi berikutnya. Lihatlah App NextJs-MongoDB-App untuk melihat modul ini digunakan.
// NPM
npm install next-session
// Yarn
yarn add next-sessionMeningkatkan dari v1.x ke v2.x? Harap baca catatan rilis di sini!
Meningkatkan dari v2.x ke v3.x? Harap baca catatan rilis di sini!
Meningkatkan dari v3.x ke v4.x? Harap baca catatan rilis di sini!
PERINGATAN Toko sesi default (jika options?.store undefined ), MemoryStore , tidak berfungsi di lingkungan produksi atau server tanpa server. Anda harus menggunakan toko sesi.
// ./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).`
) ;
} Penggunaan dalam rute API dapat mengakibatkan API resolved without sending a response . Ini dapat diselesaikan dengan menambahkan:
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() atau pengaturan options.autoCommit false
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).`
) ;
} ) ;Fungsi Mikro, 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 server 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 menerima properti di bawah ini.
| opsi | keterangan | bawaan |
|---|---|---|
| nama | Nama cookie yang akan dibaca dari permintaan dan diatur ke tanggapan. | sid |
| toko | Contoh toko sesi yang akan digunakan. Diperlukan untuk bekerja dalam produksi! | MemoryStore |
| Genid | Fungsi yang menghasilkan string untuk ID sesi baru. | nanoid |
| menyandi | Mengubah ID sesi sebelum mengatur cookie. Dibutuhkan ID sesi mentah dan mengembalikan ID sesi yang diterjemahkan/didekripsi. | belum diartikan |
| membaca sandi | Mengubah ID sesi kembali saat mendapatkan dari cookie. Itu harus mengembalikan ID sesi yang dikodekan/dienkripsi | belum diartikan |
| TouchAfter | Hanya sentuh setelah jumlah waktu (dalam detik) sejak akses terakhir. Dinonaktifkan secara default atau jika diatur ke -1 . Lihat TouchAfter. | -1 (dinonaktifkan) |
| Autocommit | Secara otomatis melakukan sesi. Nonaktifkan ini jika Anda ingin session.commit() | true |
| cookie.secure | Menentukan nilai boolean untuk atribut Set-Cookie yang aman . | false |
| cookie.httponly | Menentukan nilai boolean untuk atribut httponly Set-Cookie . | true |
| cookie.path | Menentukan nilai untuk atribut Set-Cookie path . | / |
| cookie.domain | Menentukan nilai untuk atribut Set-Cookie domain . | tidak ada |
| cookie.samesite | Menentukan nilai untuk atribut Set-Cookie Samesite . | tidak ada |
| cookie.maxage | (dalam detik) Menentukan nilai untuk atribut Set-Cookie usia maksimal . | Unset (sesi browser) |
Menyentuh mengacu pada perpanjangan seumur hidup sesi, baik di browser (dengan memodifikasi atribut Expires di header set-cookie) dan Sesi Store (menggunakan metode masing-masing) setelah akses. Ini mencegah sesi kedaluwarsa setelah beberapa saat.
Dalam mode autoCommit (yang diaktifkan secara default), untuk optimasi, sesi hanya disentuh, tidak disimpan, jika tidak dimodifikasi. Nilai touchAfter memungkinkan Anda untuk melewatkan sentuhan jika sesi masih baru, dengan demikian, mengurangi beban basis data.
Anda dapat menyediakan sepasang fungsi khusus yang mengkode/mendekode atau mengenkripsi/mendekripsi cookie pada setiap permintaan.
// `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 ) ,
} ) ; Ini memungkinkan Anda untuk menetapkan atau mendapatkan nilai spesifik yang terkait dengan sesi saat ini.
// Set a value
if ( loggedIn ) session . user = "John Doe" ;
// Get a value
const currentUser = session . user ; // "John Doe" Memperluas secara manual sesi kedaluwarsa dengan Maxage. Catatan: Anda masih harus menelepon session.commit () jika autoCommit = false .
session . touch ( ) ; Jika touchAfter diatur dengan nilai non-negatif, ini akan secara otomatis dipanggil sesuai.
Hancurkan ke sesi saat ini dan hapus dari toko sesi.
if ( loggedOut ) await session . destroy ( ) ; Simpan sesi dan atur header yang perlu. Janji kembali. Itu harus dipanggil sebelum mengirim header ( res.writeHead ) atau respons ( res.send , res.end , dll.) .
Anda harus memanggil ini jika autoCommit diatur ke false .
session . hello = "world" ;
await session . commit ( ) ;
// always calling res.end or res.writeHead after the aboveID unik yang terkait dengan sesi saat ini.
Toko sesi yang akan digunakan untuk middleware sesi (lihat options di atas).
Toko sesi yang kompatibel harus mencakup tiga fungsi: set(sid, session) , get(sid) , dan destroy(sid) . touch(sid, session) direkomendasikan. Semua fungsi harus mengembalikan janji .
Rujuk ke Memorystore.
TypeScript: Tipe SessionStore dapat digunakan untuk membantu implementasi:
import type { SessionStore } from "next-session" ;
class CustomStore implements SessionStore { } Untuk menggunakan toko Express/Connect, Anda harus menjanjikan, get set destroy , dan (jika ada) metode touch , mungkin menggunakan util.promisify .
Kami menyertakan util promisifyStore di next-session/lib/compat untuk melakukan hal itu:
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 ) ,
} ) ; Anda dapat menggunakan expressSession dari next-session/lib/compat jika toko Connect memiliki pola berikut.
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 ( ) ,
} )
) ,
} ) ; Silakan lihat kontribusi saya.
Mit