Deixe-me repetir esta parte da pergunta que as respostas aqui estão ignorando:
Isso pode ser feito em algumas linhas de código, sem a necessidade de puxar uma lib de terceiros?
Lendo Cookies
Os cookies são lidos a partir de solicitações com o Cookie
cabeçalho. Eles incluem apenas um name
e value
. Devido à maneira como os caminhos funcionam, vários cookies com o mesmo nome podem ser enviados. No NodeJS, todos os cookies são inseridos como uma sequência, pois são enviados no Cookie
cabeçalho. Você os separou ;
. Depois de ter um cookie, tudo à esquerda dos iguais (se houver) é o name
, e tudo depois é o value
. Alguns navegadores aceitam um cookie sem sinal de igual e assumem o nome em branco. Espaços em branco não contam como parte do cookie. Os valores também podem ser colocados entre aspas duplas ( "
). Os valores também podem conter =
. Por exemplo, formula=5+3=8
é um cookie válido.
/**
* @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());
Se você não está esperando nomes duplicados, pode converter em um objeto que facilita as coisas. Então você pode acessar como object.myCookieName
para obter o valor. Se você está esperando duplicatas, deseja fazer a iteração cookieEntries
. Os navegadores alimentam os cookies com prioridade decrescente, portanto, a reversão garante que o cookie de maior prioridade seja exibido no objeto. (O .slice()
objetivo é evitar a mutação da matriz.)
Cookies de configurações
"Escrever" cookies é feito usando o Set-Cookie
cabeçalho na sua resposta. O response.headers['Set-Cookie']
objeto é realmente uma matriz, então você estará pressionando para isso. Ele aceita uma string, mas tem mais valores do que apenas name
e value
. A parte mais difícil é escrever a string, mas isso pode ser feito em uma linha.
/**
* @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);
Lembre-se de que você pode definir vários cookies, porque na verdade pode definir vários Set-Cookie
cabeçalhos em sua solicitação. É por isso que é uma matriz.
Nota sobre bibliotecas externas:
Se você decidir usar o express
,, cookie-parser
ou cookie
, observe que eles têm padrões que não são padrão. Os cookies analisados são sempre decodificados por URI (decodificado em porcentagem). Isso significa que, se você usar um nome ou valor com qualquer um dos seguintes caracteres: !#$%&'()*+/:<=>?@[]^`{|}
eles serão tratados de maneira diferente com essas bibliotecas. Se você estiver configurando cookies, eles serão codificados %{HEX}
. E se você estiver lendo um cookie, precisará decodificá-lo.
Por exemplo, embora email=name@domain.com
seja um cookie válido, essas bibliotecas o codificarão como email=name%40domain.com
. A decodificação pode apresentar problemas se você estiver usando o %
em seu cookie. Vai ficar mutilado. Por exemplo, seu cookie que era: secretagentlevel=50%007and50%006
se torna secretagentlevel=507and506
. Esse é um caso extremo, mas algo a ser observado se você mudar de biblioteca.
Além disso, nessas bibliotecas, os cookies são configurados com um padrão, o path=/
que significa que eles são enviados a cada solicitação de URL para o host.
Se você desejar codificar ou decodificar esses valores, poderá usar encodeURIComponent
ou decodeURIComponent
, respectivamente.
Referências:
Informação adicional:
=
sinal de igual ( ) como em um dos cookies do Facebook, comofbm_1234123412341234=base_domain=.domain.com
.