Дозвольте повторити цю частину запитання, на яку тут відповіді ігноруються:
Чи можна це зробити за допомогою декількох рядків коду, без необхідності втягувати сторонні вкладки?
Читання файлів 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.