Легкое промежуточное программное обеспечение для сеанса на основе обещаний для следующего.js. Также работает на http -сервере Micro или Node.js, 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 ,
} ,
} ; 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 ,
} ,
} ;
}Экспресс, следующее соединение
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 Server Functions
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 |
| генид | Функция, которая генерирует строку для нового идентификатора сеанса. | nanoid |
| кодировать | Преобразовать идентификатор сеанса перед установкой файлов cookie. Это требует идентификатора сеанса RAW и возвращает декодированный/расшифрованный идентификатор сеанса. | неопределенный |
| декодировать | Преобразование идентификатора сеанса обратно, когда вы получаете от cookie. Он должен вернуть кодированный/зашифрованный идентификатор сеанса | неопределенный |
| Touchafter | Прикоснитесь только через некоторое время (в секундах) с момента последнего доступа. Отключено по умолчанию или если установлено на -1 . Смотрите Touchafter. | -1 (отключен) |
| Автодомит | Автоматически совершать сеанс. Отключите это, если вы хотите вручную session.commit() | true |
| cookie.secure | Определяет логическое значение для атрибута Secure Set-Cookie . | false |
| cookie.httponly | Указывает логическое значение для атрибута Httponly Set-Cookie . | true |
| cookie.path | Определяет значение для атрибута Set-Cookie Path . | / |
| cookie.domain | Определяет значение для атрибута домена Set-Cookie . | нереходистый |
| cookie.samesite | Определяет значение для атрибута Set-Cookie . | нереходистый |
| cookie.maxage | (В секундах) указывает значение для атрибута Set-Cookie Max-Age . | unset (сеанс браузера) |
Прикосновение относится к расширению срока службы сеанса, как в браузере (путем изменения атрибута Expires в заголовке Set-Cookie), так и в магазине сеанса (с использованием соответствующего метода) при доступе. Это мешает сеансу истечь через некоторое время.
В режиме autoCommit (который включен по умолчанию), для оптимизации сеанс касается, а не сохраняется, если он не изменен. Значение 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. Примечание. Вы все равно должны позвонить 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) . Все функции должны возвращать обещания .
Обратитесь к Store Store.
TypeScript: тип SessionStore можно использовать для помощи в реализации:
import type { SessionStore } from "next-session" ;
class CustomStore implements SessionStore { } Чтобы использовать магазины Express/Connect, вы должны обещать 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 есть следующая шаблона.
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 ( ) ,
} )
) ,
} ) ; Пожалуйста, посмотрите My Appling.md.
Грань