Позвольте мне повторить эту часть вопроса, ответы на которую здесь игнорируются:
Может ли это быть сделано в несколько строк кода, без необходимости использовать стороннюю библиотеку?
Чтение файлов cookie
Куки читаются по запросам с Cookie
заголовком. Они включают в себя только name
и value
. Из-за способа работы путей можно отправлять несколько файлов cookie с одним и тем же именем. В NodeJS все Cookies в одной строке, как они отправляются в 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 с нисходящим приоритетом, поэтому обращение гарантирует, что файл cookie с наивысшим приоритетом появляется в объекте. ( .slice()
Чтобы избежать мутации массива.)
Настройки Cookies
«Написание» куки осуществляется с помощью 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 (в процентах). Это означает, что если вы используете имя или значение, которое имеет любой из следующих символов: !#$%&'()*+/:<=>?@[]^`{|}
они будут обрабатываться по-разному в этих библиотеках. Если вы устанавливаете куки, они кодируются с %{HEX}
. И если вы читаете печенье, вы должны их расшифровать.
Например, хотя email=name@domain.com
это допустимый файл cookie, эти библиотеки будут кодировать его как email=name%40domain.com
. Декодирование может вызвать проблемы, если вы используете %
в своем файле cookie. Это будет искажено. Например, ваш файл cookie, который был: secretagentlevel=50%007and50%006
становитсяsecretagentlevel=507and506
. Это крайний случай, но на что следует обратить внимание при переключении библиотек.
Кроме того, в этих библиотеках для файлов cookie устанавливается значение по умолчанию, path=/
что означает, что они отправляются на каждый URL-запрос к хосту.
Если вы хотите кодировать или декодировать эти значения самостоятельно, вы можете использовать encodeURIComponent
или decodeURIComponent
, соответственно.
Ссылки:
Дополнительная информация:
=
), как в одном из файлов cookie Facebookfbm_1234123412341234=base_domain=.domain.com
.