الوسيطة للجلسة الخفيفة القائمة على الوعد لـ 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؟ يرجى قراءة ملاحظات الإصدار هنا!
تحذير من متجر الجلسة undefined ( إذا MemoryStore options?.store يجب عليك استخدام متجر جلسة.
// ./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 ,
} ,
} ; await session.commit() أو تحديد 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 ، الاتصال التالي
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 |
| تشفير | يحول معرف الجلسة قبل تعيين ملف تعريف الارتباط. يستغرق معرف الجلسة الخام وإرجاع معرف الجلسة غير المقطّر/فك تشفيره. | غير محدد |
| فك الشفرة | يحول معرف الجلسة مرة أخرى أثناء الوصول من ملف تعريف الارتباط. يجب أن يعيد معرف الجلسة المشفرة/المشفرة | غير محدد |
| Touchafter | لمس فقط بعد مبلغ من الوقت (بالثواني) منذ آخر الوصول. معطل افتراضيًا أو إذا تم تعيينه على -1 . انظر Touchafter. | -1 (معطل) |
| Autocommit | جلسة الالتزام تلقائيا. قم بتعطيل هذا إذا كنت ترغب في session.commit() | true |
| ملف تعريف الارتباط | يحدد القيمة المنطقية لسمة SECTER Set-Cookie . | false |
| cookie.httponly | يحدد القيمة المنطقية لسمة HTTPonly Set-Cookie . | true |
| ملف تعريف الارتباط | يحدد قيمة سمة المسار Set-Cookie . | / |
| ملف تعريف الارتباط | يحدد قيمة سمة COOKIE Set-Cookie . | unset |
| ملف تعريف الارتباط | يحدد قيمة سمة SameSite Set-Cookie . | unset |
| ملف تعريف الارتباط | (في الثواني) يحدد قيمة سمة Max-Age Set-Cookie . | unset (جلسة المتصفح) |
يشير اللمس إلى امتداد عمر الجلسة ، سواء في المتصفح (عن طريق تعديل سمة Expires في رأس 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. ملاحظة: لا يزال يتعين عليك الاتصال Session.Commit () إذا كان 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 aboveالمعرف الفريد الذي يربط الجلسة الحالية.
متجر الجلسة لاستخدامه في الوسيطة الوسيطة (انظر options أعلاه).
يجب أن يتضمن متجر الجلسة المتوافق ثلاث وظائف: set(sid, session) ، get(sid) ، و destroy(sid) . يوصى touch(sid, session) . يجب أن تعيد جميع الوظائف الوعود .
الرجوع إلى MemoryStore.
TypeScript: يمكن استخدام نوع SessionStore للمساعدة في التنفيذ:
import type { SessionStore } from "next-session" ;
class CustomStore implements SessionStore { } لاستخدام متاجر Express/Connect ، يجب أن تنوع طرق touch ، get set destroy ، و (إذا كانت موجودة) ، وربما باستخدام 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 النمط التالي.
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 ( ) ,
} )
) ,
} ) ; يرجى الاطلاع على مساهمي.
معهد ماساتشوستس للتكنولوجيا