มิดเดิลแวร์เซสชันที่มีน้ำหนักเบา ตามสัญญา สำหรับ Next.js. ยังทำงานใน Micro หรือ Node.js Http Server, Express และอื่น ๆ
ตรวจสอบทางเลือกอื่น ๆ เช่นการทำเหล็กถัดไป ลองดูที่ NextJS-MongoDB-App เพื่อดูโมดูลนี้ที่ใช้งาน
// NPM
npm install next-session
// Yarn
yarn add next-sessionการอัพเกรดจาก v1.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 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, 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 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 ยอมรับคุณสมบัติด้านล่าง
| ตัวเลือก | คำอธิบาย | ค่าเริ่มต้น |
|---|---|---|
| ชื่อ | ชื่อของคุกกี้ที่จะอ่านจากคำขอและตั้งค่าเป็นคำตอบ | sid |
| เก็บ | อินสแตนซ์ของเซสชันร้านค้าที่จะใช้ ต้อง ทำงานในการผลิต! | MemoryStore |
| ยอง | ฟังก์ชั่นที่สร้างสตริงสำหรับรหัสเซสชันใหม่ | nanoid |
| เข้ารหัส | แปลงรหัสเซสชันก่อนตั้งค่าคุกกี้ ต้องใช้รหัสเซสชัน RAW และส่งคืนรหัสเซสชันที่ถอดรหัส/ถอดรหัส | ไม่ได้กำหนด |
| ถอดรหัส | แปลง ID เซสชันกลับมาในขณะที่ได้รับจากคุกกี้ ควรส่งคืนรหัสเซสชันที่เข้ารหัส/เข้ารหัส | ไม่ได้กำหนด |
| หลังจาก | สัมผัสหลังจากผ่านไประยะเวลาหนึ่ง (ในไม่กี่วินาที) นับตั้งแต่การเข้าถึงครั้งล่าสุด ปิดใช้งานโดยค่าเริ่มต้นหรือตั้งค่าเป็น -1 ดู touchfter | -1 (ปิดใช้งาน) |
| อัตโนมัติ | ส่งเซสชันโดยอัตโนมัติ ปิดการใช้งานสิ่งนี้หากคุณต้องการ session.commit() | true |
| คุกกี้ความปลอดภัย | ระบุค่าบูลีนสำหรับ แอตทริบิวต์ Set-Cookie | false |
| COOKIE.httponly | ระบุค่าบูลีนสำหรับแอตทริบิวต์ httponly Set-Cookie | true |
| Cookie.Path | ระบุค่าสำหรับแอตทริบิวต์ Set-Cookie Path | / |
| คุกกี้โดเมน | ระบุค่าสำหรับแอตทริบิวต์ Set-Cookie ของโดเมน | ทำให้ไม่ได้ |
| Cookie.samesite | ระบุค่าสำหรับแอตทริบิวต์ Samesite Set-Cookie | ทำให้ไม่ได้ |
| Cookie.maxage | (ในไม่กี่วินาที) ระบุค่าสำหรับแอตทริบิวต์ Set-Cookie Max-Age | UNSET (เซสชันเบราว์เซอร์) |
การสัมผัสหมายถึงส่วนขยายของอายุการใช้งานเซสชันทั้งในเบราว์เซอร์ (โดยการแก้ไขแอตทริบิวต์ Expires ในส่วนหัวของ Set-Cookie) และที่เก็บเซสชัน (ใช้วิธีการที่เกี่ยวข้อง) เมื่อเข้าถึง สิ่งนี้จะป้องกันไม่ให้เซสชันหมดอายุหลังจากผ่านไประยะหนึ่ง
ในโหมด autoCommit (ซึ่งเปิดใช้งานโดยค่าเริ่มต้น) เพื่อการเพิ่มประสิทธิภาพเซสชันจะถูกสัมผัสเท่านั้นไม่ได้บันทึกไว้หากไม่ได้รับการแก้ไข ค่าของ touchAfter ช่วยให้คุณสามารถข้ามการสัมผัสได้หากเซสชันยังคงอยู่ล่าสุดดังนั้นจึงลดการโหลดฐานข้อมูล
คุณสามารถจัดหาฟังก์ชั่นคู่ที่กำหนดเองที่ เข้ารหัส/ถอดรหัส หรือ เข้ารหัส/ถอดรหัส คุกกี้ในทุกคำขอ
// `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 หมายเหตุ: คุณยังต้องเรียกเซสชัน commmit () หาก autoCommit = false
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 aboveID ที่ไม่ซ้ำกันที่เชื่อมโยงกับเซสชันปัจจุบัน
Session Store ที่จะใช้สำหรับมิดเดิลแวร์เซสชัน (ดู options ด้านบน)
ที่เก็บเซสชันที่เข้ากันได้จะต้องมีสามฟังก์ชั่น: set(sid, session) , get(sid) และ destroy(sid) แนะนำให้ touch(sid, session) ฟังก์ชั่นทั้งหมดจะต้องส่งคืน สัญญา
อ้างถึง MemoryStore
TypeScript: ประเภท SessionStore สามารถใช้เพื่อช่วยในการใช้งาน:
import type { SessionStore } from "next-session" ;
class CustomStore implements SessionStore { } ในการใช้ร้านค้าด่วน/เชื่อมต่อคุณต้องสัญญาว่า get set destroy และ (ถ้ามีอยู่) วิธี touch อาจใช้ util.promisify
เรารวม Util promisifyStore ไว้ใน next-session/lib/compat เพื่อทำเช่นนั้น:
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 ) ,
} ) ; คุณสามารถใช้ expressSession จาก next-session/lib/compat หาก CONNECT Store มีรูปแบบต่อไปนี้
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 ( ) ,
} )
) ,
} ) ; โปรดดูการสนับสนุนของฉัน
มิกซ์