Hãy để tôi nhắc lại phần câu hỏi mà câu trả lời ở đây đang bỏ qua:
Nó có thể được thực hiện trong một vài dòng mã, mà không cần phải kéo vào một bên thứ ba lib?
Đọc bánh quy
Cookies được đọc từ các yêu cầu với Cookie
tiêu đề. Chúng chỉ bao gồm một name
và value
. Do cách thức hoạt động của đường dẫn, nhiều cookie cùng tên có thể được gửi. Trong NodeJS, tất cả Cookies trong một chuỗi khi chúng được gửi trong Cookie
tiêu đề. Bạn chia chúng với ;
. Khi bạn có cookie, mọi thứ ở bên trái của bằng (nếu có) là name
và mọi thứ sau đó là value
. Một số trình duyệt sẽ chấp nhận cookie không có dấu bằng và giả sử tên trống. Whitespaces không được tính là một phần của cookie. Các giá trị cũng có thể được gói trong dấu ngoặc kép ( "
). Các giá trị cũng có thể chứa =
. Ví dụ, formula=5+3=8
là một cookie hợp lệ.
/**
* @param {string} [cookieString='']
* @return {[string,string][]} String Tuple
*/
function getEntriesFromCookie(cookieString = '') {
return cookieString.split(';').map((pair) => {
const indexOfEquals = pair.indexOf('=');
let name;
let value;
if (indexOfEquals === -1) {
name = '';
value = pair.trim();
} else {
name = pair.substr(0, indexOfEquals).trim();
value = pair.substr(indexOfEquals + 1).trim();
}
const firstQuote = value.indexOf('"');
const lastQuote = value.lastIndexOf('"');
if (firstQuote !== -1 && lastQuote !== -1) {
value = value.substring(firstQuote + 1, lastQuote);
}
return [name, value];
});
}
const cookieEntries = getEntriesFromCookie(request.headers.Cookie);
const object = Object.fromEntries(cookieEntries.slice().reverse());
Nếu bạn không mong đợi các tên trùng lặp, thì bạn có thể chuyển đổi thành một đối tượng giúp mọi việc dễ dàng hơn. Sau đó, bạn có thể truy cập như object.myCookieName
để có được giá trị. Nếu bạn đang mong đợi các bản sao, thì bạn muốn lặp đi lặp lại cookieEntries
. Trình duyệt cung cấp cookie theo mức độ ưu tiên giảm dần, do đó việc đảo ngược đảm bảo cookie có mức độ ưu tiên cao nhất xuất hiện trong đối tượng. (Đây .slice()
là để tránh đột biến của mảng.)
Cài đặt cookie
"Viết" cookie được thực hiện bằng cách sử dụng Set-Cookie
tiêu đề trong phản hồi của bạn. Đối response.headers['Set-Cookie']
tượng thực sự là một mảng, vì vậy bạn sẽ đẩy nó. Nó chấp nhận một chuỗi nhưng có nhiều giá trị hơn chỉ name
và value
. Phần khó nhất là viết chuỗi, nhưng điều này có thể được thực hiện trong một dòng.
/**
* @param {Object} options
* @param {string} [options.name='']
* @param {string} [options.value='']
* @param {Date} [options.expires]
* @param {number} [options.maxAge]
* @param {string} [options.domain]
* @param {string} [options.path]
* @param {boolean} [options.secure]
* @param {boolean} [options.httpOnly]
* @param {'Strict'|'Lax'|'None'} [options.sameSite]
* @return {string}
*/
function createSetCookie(options) {
return (`${options.name || ''}=${options.value || ''}`)
+ (options.expires != null ? `; Expires=${options.expires.toUTCString()}` : '')
+ (options.maxAge != null ? `; Max-Age=${options.maxAge}` : '')
+ (options.domain != null ? `; Domain=${options.domain}` : '')
+ (options.path != null ? `; Path=${options.path}` : '')
+ (options.secure ? '; Secure' : '')
+ (options.httpOnly ? '; HttpOnly' : '')
+ (options.sameSite != null ? `; SameSite=${options.sameSite}` : '');
}
const newCookie = createSetCookie({
name: 'cookieName',
value: 'cookieValue',
path:'/',
});
response.headers['Set-Cookie'].push(newCookie);
Hãy nhớ rằng bạn có thể đặt nhiều cookie, vì thực tế bạn có thể đặt nhiều Set-Cookie
tiêu đề trong yêu cầu của mình. Đó là lý do tại sao nó là một mảng.
Lưu ý về các thư viện bên ngoài:
Nếu bạn quyết định sử dụng express
, cookie-parser
hoặc cookie
, lưu ý họ có giá trị mặc định mà không chuẩn. Cookie được phân tích cú pháp luôn được giải mã URI (phần trăm được giải mã). Điều đó có nghĩa là nếu bạn sử dụng tên hoặc giá trị có bất kỳ ký tự nào sau đây: !#$%&'()*+/:<=>?@[]^`{|}
chúng sẽ được xử lý khác nhau với các thư viện đó. Nếu bạn đang đặt cookie, chúng được mã hóa bằng%{HEX}
. Và nếu bạn đang đọc cookie, bạn phải giải mã chúng.
Ví dụ, trong khi email=name@domain.com
là một cookie hợp lệ, các thư viện này sẽ mã hóa nó dưới dạng email=name%40domain.com
. Giải mã có thể thể hiện các vấn đề nếu bạn đang sử dụng %
trong cookie của mình. Nó sẽ bị hỏng. Ví dụ: cookie của bạn là: secretagentlevel=50%007and50%006
trở thànhsecretagentlevel=507and506
. Đó là một trường hợp cạnh, nhưng một điều cần lưu ý nếu chuyển đổi thư viện.
Ngoài ra, trên các thư viện này, cookie được đặt mặc định path=/
có nghĩa là chúng được gửi trên mỗi yêu cầu url đến máy chủ lưu trữ.
Nếu bạn muốn tự mã hóa hoặc giải mã các giá trị này, bạn có thể sử dụng encodeURIComponent
hoặc decodeURIComponent
, tương ứng.
Người giới thiệu:
Thông tin thêm:
=
) như trong một trong các cookie của Facebook như thế nàofbm_1234123412341234=base_domain=.domain.com
.