HTTP cookie là một mẩu dữ liệu nhỏ được browser của người dùng lưu trữ. Cookie được thiết kế để làm cơ chế đáng tin cậy cho website ghi nhớ thông tin trạng thái (stateful). Khi người dùng truy cập lại website, cookie sẽ tự động được gửi kèm request.
Use with Express (default) (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 cookie-parser
$ npm i -D @types/cookie-parser
Sau khi cài xong, áp dụng middleware cookie-parser như một global middleware (ví dụ, trong file main.ts của bạn).
import cookieParser from 'cookie-parser';
// đặt ở đâu đó trong file khởi tạo của bạn
app.use(cookieParser());
Bạn có thể truyền một số option cho middleware cookieParser:
secretmột string hoặc mảng dùng để ký (sign) cookie. Tùy chọn này là optional, và nếu không chỉ định, sẽ không parse các signed cookie. Nếu một string được cung cấp, nó sẽ được dùng làm secret. Nếu một mảng được cung cấp, sẽ có nỗ lực unsign cookie với từng secret theo thứ tự.optionsmột object được truyền vàocookie.parsenhư tham số thứ hai. Xem cookie để biết thêm thông tin.
Middleware sẽ parse header Cookie trên request và expose dữ liệu cookie qua property req.cookies, và nếu có secret được cung cấp, qua property req.signedCookies. Các property này là các cặp tên-giá trị của tên cookie và giá trị cookie.
Khi một secret được cung cấp, module này sẽ unsign và validate mọi giá trị signed cookie, đồng thời chuyển các cặp tên-giá trị đó từ req.cookies sang req.signedCookies. Signed cookie là cookie có giá trị được thêm tiền tố s:. Signed cookie không qua được validation chữ ký sẽ có giá trị false thay vì giá trị đã bị sửa đổi.
Với thiết lập này, bạn có thể đọc cookie ngay trong route handler, như sau:
@Get()
findAll(@Req() request: Request) {
console.log(request.cookies); // hoặc "request.cookies['cookieKey']"
// hoặc console.log(request.signedCookies);
}
Gợi ý Decorator @Req() được import từ @nestjs/common, còn Request từ package express.
Để gắn một cookie vào response trả về, dùng phương thức Response#cookie():
@Get()
findAll(@Res({ passthrough: true }) response: Response) {
response.cookie('key', 'value')
}
Cảnh báo Nếu bạn muốn để logic xử lý response cho framework, nhớ đặt option passthrough thành true, như minh họa trên. Đọc thêm tại đây.
Gợi ý Decorator @Res() được import từ @nestjs/common, còn Response từ package express.
Use with Fastify (Dùng với Fastify)
Đầu tiên, cài package cần thiết:
$ npm i @fastify/cookie
Sau khi cài xong, đăng ký plugin @fastify/cookie:
import fastifyCookie from '@fastify/cookie';
// đặt ở đâu đó trong file khởi tạo của bạn
const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
await app.register(fastifyCookie, {
secret: 'my-secret', // dùng để ký cookie
});
Với thiết lập này, bạn có thể đọc cookie ngay trong route handler, như sau:
@Get()
findAll(@Req() request: FastifyRequest) {
console.log(request.cookies); // hoặc "request.cookies['cookieKey']"
}
Gợi ý Decorator @Req() được import từ @nestjs/common, còn FastifyRequest từ package fastify.
Để gắn một cookie vào response trả về, dùng phương thức FastifyReply#setCookie():
@Get()
findAll(@Res({ passthrough: true }) response: FastifyReply) {
response.setCookie('key', 'value')
}
Để đọc thêm về phương thức FastifyReply#setCookie(), xem trang này.
Cảnh báo Nếu bạn muốn để logic xử lý response cho framework, nhớ đặt option passthrough thành true, như minh họa trên. Đọc thêm tại đây.
Gợi ý Decorator @Res() được import từ @nestjs/common, còn FastifyReply từ package fastify.
Creating a custom decorator (cross-platform) (Tạo decorator tùy chỉnh - cross-platform)
Để có một cách tiện lợi, khai báo rõ ràng (declarative) để truy cập cookie đến, chúng ta có thể tạo một custom decorator.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const Cookies = createParamDecorator((data: string, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return data ? request.cookies?.[data] : request.cookies;
});
Decorator @Cookies() sẽ trích xuất toàn bộ cookie, hoặc một cookie theo tên từ object req.cookies và điền giá trị đó vào tham số được decorate.
Với thiết lập này, chúng ta có thể dùng decorator này trong signature của route handler, như sau:
@Get()
findAll(@Cookies('name') name: string) {}
Ghi chú người dịch Tương tự cookie-parser trong Express thuần hoặc middleware đọc cookie ở Laravel (Illuminate\Cookie), Nest không tự làm điều đó — nó chỉ bọc lại middleware gốc của Express/Fastify. Nghĩa là bạn vẫn phải hiểu cách adapter bên dưới (Express hay Fastify) xử lý cookie, vì API và hành vi (ví dụ ký cookie, passthrough) khác nhau giữa hai adapter này.