Permítanme repetir esta parte de la pregunta que las respuestas aquí ignoran:
¿Se puede hacer en unas pocas líneas de código, sin la necesidad de obtener una biblioteca de terceros?
Cookies de lectura
Las cookies se leen de las solicitudes con el Cookie
encabezado. Solo incluyen a name
y value
. Debido a la forma en que funcionan las rutas, se pueden enviar múltiples cookies del mismo nombre. En NodeJS, todas las cookies en una sola cadena a medida que se envían en el Cookie
encabezado. Los dividiste con ellos ;
. Una vez que tiene una cookie, todo a la izquierda de los iguales (si está presente) es el name
, y todo lo que sigue es el value
. Algunos navegadores aceptarán una cookie sin signo igual y supondrán que el nombre está en blanco. Los espacios en blanco no cuentan como parte de la cookie. Los valores también se pueden incluir entre comillas dobles ( "
). Los valores también pueden contener =
. Por ejemplo, formula=5+3=8
es una cookie válida.
/**
* @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());
Si no espera nombres duplicados, puede convertirlos en un objeto que facilite las cosas. Entonces puede acceder como object.myCookieName
para obtener el valor. Si espera duplicados, entonces desea iterar cookieEntries
. Los navegadores alimentan las cookies con prioridad descendente, por lo que la inversión asegura que la cookie de mayor prioridad aparezca en el objeto. (El .slice()
objetivo es evitar la mutación de la matriz).
Cookies de configuración
Las cookies de "escritura" se realizan utilizando el Set-Cookie
encabezado en su respuesta. El response.headers['Set-Cookie']
objeto es en realidad una matriz, por lo que lo empujará hacia él. Acepta una cadena pero tiene más valores que solo name
y value
. La parte más difícil es escribir la cadena, pero esto se puede hacer en una línea.
/**
* @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);
Recuerde que puede configurar múltiples cookies, porque en realidad puede configurar múltiples Set-Cookie
encabezados en su solicitud. Por eso es una matriz.
Nota sobre bibliotecas externas:
Si decide utilizar el express
, cookie-parser
o cookie
, tenga en cuenta que tienen valores predeterminados que no son estándar. Las cookies analizadas siempre se decodifican por URI (decodificación porcentual). Eso significa que si usa un nombre o valor que tenga alguno de los siguientes caracteres: !#$%&'()*+/:<=>?@[]^`{|}
se manejarán de manera diferente con esas bibliotecas. Si está configurando cookies, están codificadas con %{HEX}
. Y si estás leyendo una cookie, debes decodificarla.
Por ejemplo, si bien email=name@domain.com
es una cookie válida, estas bibliotecas la codificarán como email=name%40domain.com
. La decodificación puede presentar problemas si está utilizando el %
en su cookie. Se destrozará. Por ejemplo, su cookie que fue: se secretagentlevel=50%007and50%006
convierte secretagentlevel=507and506
. Ese es un caso extremo, pero algo a tener en cuenta si se cambia de biblioteca.
Además, en estas bibliotecas, las cookies se configuran de manera predeterminada, lo path=/
que significa que se envían en cada solicitud de URL al host.
Si desea codificar o decodificar estos valores usted mismo, puede usar encodeURIComponent
o decodeURIComponent
, respectivamente.
Referencias
Información Adicional:
=
signo igual ( ) como en una de las cookies de Facebook comofbm_1234123412341234=base_domain=.domain.com
.