HTTP session cung cấp cách lưu thông tin về user qua nhiều request khác nhau, đặc biệt hữu ích cho ứng dụng MVC.
Dùng với Express (mặc định)
Đầu tiên, cài package cần thiết (và type của nó cho người dùng TypeScript):
$ npm i express-session
$ npm i -D @types/express-session
Sau khi cài đặt xong, áp dụng middleware express-session như một middleware global (ví dụ, trong file main.ts của bạn).
import session from 'express-session';
// đặt ở đâu đó trong file khởi tạo (initialization) của bạn
app.use(
session({
secret: 'my-secret',
resave: false,
saveUninitialized: false,
}),
);
Cảnh báo Cơ chế lưu session phía server mặc định (default server-side session storage) có chủ đích không được thiết kế cho môi trường production. Nó sẽ leak memory (rò bộ nhớ) trong hầu hết các trường hợp, không scale được quá một process, và chỉ dùng để debug và phát triển. Đọc thêm ở repository chính thức.
secret được dùng để ký (sign) session ID cookie. Giá trị này có thể là một string cho một secret duy nhất, hoặc một array chứa nhiều secret. Nếu bạn cung cấp một array secret, chỉ phần tử đầu tiên được dùng để ký session ID cookie, còn tất cả các phần tử sẽ được xem xét khi verify chữ ký trong các request. Secret bản thân nó nên khó bị con người đoán ra, tốt nhất nên là một tập ký tự ngẫu nhiên.
Bật option resave sẽ buộc session phải được lưu lại (save back) vào session store, ngay cả khi session không hề bị thay đổi trong suốt request đó. Giá trị mặc định là true, nhưng dùng mặc định này đã bị deprecated (không còn khuyến nghị), vì giá trị mặc định sẽ thay đổi trong tương lai.
Tương tự, bật option saveUninitialized sẽ buộc một session đang “chưa được khởi tạo” (uninitialized) phải được lưu vào store. Một session được coi là uninitialized khi nó mới được tạo nhưng chưa bị thay đổi. Chọn false hữu ích khi implement session đăng nhập, giảm dung lượng lưu trữ ở server, hoặc để tuân thủ các luật yêu cầu phải có sự cho phép trước khi set cookie. Chọn false cũng giúp tránh race condition khi client gửi nhiều request song song mà chưa có session (nguồn).
Bạn có thể truyền nhiều option khác cho middleware session, đọc thêm về chúng trong tài liệu API.
Gợi ý Xin lưu ý rằng secure: true là option được khuyến nghị. Tuy nhiên, nó yêu cầu website phải hỗ trợ https, nghĩa là HTTPS là bắt buộc để dùng cookie secure. Nếu secure được set, mà bạn truy cập site qua HTTP, cookie sẽ không được set. Nếu node.js của bạn nằm sau một proxy và bạn dùng secure: true, bạn cần set "trust proxy" trong express.
Với những cài đặt trên, bây giờ bạn có thể set và đọc giá trị session ngay trong route handler, như sau:
@Get()
findAll(@Req() request: Request) {
request.session.visits = request.session.visits ? request.session.visits + 1 : 1;
}
Gợi ý Decorator @Req() được import từ @nestjs/common, còn Request được import từ package express.
Ngoài ra, bạn có thể dùng decorator @Session() để lấy session object ra từ request, như sau:
@Get()
findAll(@Session() session: Record<string, any>) {
session.visits = session.visits ? session.visits + 1 : 1;
}
Gợi ý Decorator @Session() được import từ package @nestjs/common.
Ghi chú người dịch Nếu bạn từng dùng express-session thuần với Express trước khi biết Nest, cơ chế session ở đây hoàn toàn giống nhau — Nest không thêm layer trừu tượng nào cho session cả, chỉ cung cấp decorator @Session() như một “shortcut” thay cho request.session. Đây khác với Laravel, nơi session được tích hợp sẵn vào framework và tự động lưu vào driver bạn chọn (file, redis, database) — với Nest bạn phải tự chọn và cấu hình express-session (hoặc tương đương ở Fastify) như một thư viện bên thứ ba.
Dùng với Fastify
Đầu tiên, cài package cần thiết:
$ npm i @fastify/secure-session
Sau khi cài đặt xong, register plugin fastify-secure-session:
import secureSession from '@fastify/secure-session';
// đặt ở đâu đó trong file khởi tạo (initialization) của bạn
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
await app.register(secureSession, {
secret: 'averylogphrasebiggerthanthirtytwochars',
salt: 'mq9hDxBVDbspDR6n',
});
Gợi ý Bạn cũng có thể tạo trước (pregenerate) một key (xem hướng dẫn) hoặc dùng key rotation.
Đọc thêm về các option khả dụng trong repository chính thức.
Với những cài đặt trên, bây giờ bạn có thể set và đọc giá trị session ngay trong route handler, như sau:
@Get()
findAll(@Req() request: FastifyRequest) {
const visits = request.session.get('visits');
request.session.set('visits', visits ? visits + 1 : 1);
}
Ngoài ra, bạn có thể dùng decorator @Session() để lấy session object ra từ request, như sau:
@Get()
findAll(@Session() session: secureSession.Session) {
const visits = session.get('visits');
session.set('visits', visits ? visits + 1 : 1);
}
Gợi ý Decorator @Session() được import từ @nestjs/common, còn secureSession.Session được import từ package @fastify/secure-session (câu import: import * as secureSession from '@fastify/secure-session').