Дозвольте повторити цю частину запитання, на яку тут відповіді ігноруються:
Чи можна це зробити за допомогою декількох рядків коду, без необхідності втягувати сторонні вкладки?
Читання файлів cookie
Файли cookie читаються з запитів із Cookie
заголовком. Вони включають лише name
та value
. Через те, як працюють шляхи, можна надсилати кілька однойменних файлів cookie. У NodeJS всі файли cookie в одному рядку, оскільки вони надсилаються у Cookie
заголовку. Ви розділите їх ;
. Після отримання файлу cookie все ліворуч від рівних (якщо є) - це те name
, а все після - це value
. Деякі веб-переглядачі прийматимуть файл cookie без знака рівності та вважатимуть ім'я порожнім. Пробіли не враховуються як частина файлу cookie. Значення також можна загорнути у подвійні лапки ( "
). Значення також можуть містити =
. Наприклад, formula=5+3=8
є дійсним файлом cookie.
/**
* @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());
Якщо ви не очікуєте дублювання імен, ви можете перетворити його на об'єкт, що полегшує справи. Тоді ви можете отримати доступ як, object.myCookieName
щоб отримати значення. Якщо ви очікуєте дублікатів, тоді ви хочете зробити повторення cookieEntries
. Браузери подають файли cookie у зменшенні пріоритету, тому реверсування забезпечує печиво з найвищим пріоритетом у об’єкті. (Це .slice()
уникнути мутації масиву.)
Налаштування cookie
"Написання" файлів cookie здійснюється за допомогою Set-Cookie
заголовка у вашій відповіді. response.headers['Set-Cookie']
Об'єкт насправді масив, так що ви будете штовхаючи до нього. Він приймає рядок, але має більше значень, ніж просто name
та value
. Найважча частина - це написання рядка, але це можна зробити в одному рядку.
/**
* @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);
Пам'ятайте, що ви можете встановити кілька файлів cookie, оскільки ви можете фактично встановити кілька Set-Cookie
заголовків у своєму запиті. Ось чому це масив.
Примітка щодо зовнішніх бібліотек:
Якщо ви вирішили використовувати express
, cookie-parser
або cookie
, зверніть увагу , що вони мають значення по замовчуванням , які є нестандартними. Файли cookie, розібрані завжди, URI декодуються (відсотків розшифровуються). Це означає, що якщо ви використовуєте ім’я або значення, яке має будь-який з наступних символів: !#$%&'()*+/:<=>?@[]^`{|}
вони будуть оброблятися по-різному з цими бібліотеками. Якщо ви встановлюєте файли cookie, вони кодуються %{HEX}
. І якщо ви читаєте печиво, вам потрібно їх розшифрувати.
Наприклад, хоча email=name@domain.com
це допустимий файл cookie, ці бібліотеки будуть кодувати його як email=name%40domain.com
. Розшифрування може викликати проблеми, якщо ви використовуєте %
файл cookie. Це заблукає. Наприклад, ваше печиво, яке було: secretagentlevel=50%007and50%006
стає secretagentlevel=507and506
. Це крайній випадок, але щось слід зазначити, якщо перемикати бібліотеки.
Також у цих бібліотеках файли cookie встановлюються за замовчуванням, path=/
що означає, що вони надсилаються на кожен запит URL хосту.
Якщо ви хочете самостійно кодувати або декодувати ці значення, ви можете використовувати encodeURIComponent
або decodeURIComponent
, відповідно.
Список літератури:
Додаткова інформація:
=
), як в одному з файлів cookie Facebookfbm_1234123412341234=base_domain=.domain.com
.