Next.js.의 경량 약속 기반 세션 미들웨어 Micro 또는 Node.js HTTP 서버, Express 등에서도 작동합니다.
또한 다음 아이언 세션과 같은 대안을 확인하십시오. NextJS-MongoDB-App을 살펴보면이 모듈이 사용중인 모듈을 확인하십시오.
// NPM
npm install next-session
// Yarn
yarn add next-sessionv1.x에서 v2.x로 업그레이드 하시겠습니까? 여기에서 릴리스 노트를 읽으십시오!
v2.x에서 v3.x로 업그레이드 하시겠습니까? 여기에서 릴리스 노트를 읽으십시오!
v3.x에서 v4.x로 업그레이드 하시겠습니까? 여기에서 릴리스 노트를 읽으십시오!
경고 기본 세션 저장소 ( options?.store MemoryStore undefined ? 세션 스토어를 사용해야합니다.
// ./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).`
) ;
} ) ;마이크로, vercel 서버리스 기능
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 |
| 진실 | 새 세션 ID에 대한 문자열을 생성하는 함수. | nanoid |
| 인코딩 | 쿠키를 설정하기 전에 세션 ID를 변환합니다. 원시 세션 ID가 필요하고 디코딩/해독 된 세션 ID를 반환합니다. | 한정되지 않은 |
| 풀다 | 쿠키에서 도착하는 동안 세션 ID를 다시 변환합니다. 인코딩/암호화 세션 ID를 반환해야합니다 | 한정되지 않은 |
| 터치 래프터 | 마지막으로 액세스 한 이후 몇 초 만 에 만 터치하십시오. 기본적으로 비활성화되거나 -1 로 설정된 경우. TouchAfter를 참조하십시오. | -1 (장애인) |
| 자동 커밋 | 자동으로 세션을 커밋합니다. 수동으로 session.commit() 원하시면 비활성화합니다. | true |
| 쿠키 | 보안 Set-Cookie 속성에 대한 부울 값을 지정합니다. | false |
| 쿠키 .httponly | Httponly Set-Cookie 속성의 부울 값을 지정합니다. | true |
| 쿠키 | 경로 Set-Cookie 속성의 값을 지정합니다. | / |
| 쿠키. 도메인 | 도메인 Set-Cookie 속성의 값을 지정합니다. | 세트가 없다 |
| 쿠키. 사미지 | Samesite Set-Cookie 속성의 값을 지정합니다. | 세트가 없다 |
| 쿠키 .maxage | (초) Max-Age Set-Cookie 속성의 값을 지정합니다. | UNSET (브라우저 세션) |
터치는 액세스시 브라우저 (Set-Cookie 헤더의 Expires 속성)와 액세스시 세션 스토어 (각각의 방법 사용)에서 세션 수명의 확장을 나타냅니다. 이것은 세션이 잠시 후 만료되는 것을 방지합니다.
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에 의해 세션 만료를 수동으로 확장합니다. 참고 : autoCommit = false 인 경우 여전히 session.commit ()을 호출해야합니다.
session . touch ( ) ; touchAfter 음성이 아닌 값으로 설정되면 이에 따라 자동으로 호출됩니다.
현재 세션으로 파괴하고 세션 상점에서 제거하십시오.
if ( loggedOut ) await session . destroy ( ) ; 세션을 저장하고 Neccessary 헤더를 설정하십시오. 약속을 돌려주십시오. 헤더 ( res.writeHead ) 또는 응답 ( res.send , res.end 등)을 보내기 전에 호출해야합니다.
autoCommit 이 false 로 설정된 경우이를 호출 해야합니다 .
session . hello = "world" ;
await session . commit ( ) ;
// always calling res.end or res.writeHead after the above현재 세션과 관련된 고유 한 ID.
세션 미들웨어에 사용할 세션 스토어 (위의 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 매장을 사용하려면 util.promisify 사용하여 get , set , destroy 및 (존재하는 경우) touch 방법을 약속해야합니다.
우리는 next-session/lib/compat 에 util promisifyStore 포함시킵니다.
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 ) ,
} ) ; Connect Store에 다음 패턴이있는 경우 next-session/lib/compat 에서 expressSession 사용할 수 있습니다.
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 ( ) ,
} )
) ,
} ) ; 내 기여 .md를 참조하십시오.
MIT