Vorrei ripetere questa parte della domanda che le risposte qui stanno ignorando:
Può essere fatto in poche righe di codice, senza la necessità di inserire una lib di terze parti?
Lettura dei cookie
I cookie vengono letti dalle richieste con l' Cookieintestazione. Includono solo un namee value. A causa del modo in cui funzionano i percorsi, è possibile inviare più cookie con lo stesso nome. In NodeJS, tutti i cookie vengono inseriti in un'unica stringa quando vengono inviati Cookienell'intestazione. Li hai divisi con ;. Una volta che hai un cookie, tutto a sinistra degli uguali (se presente) è il name, e tutto ciò che segue è il value. Alcuni browser accetteranno un cookie senza segno di uguale e presumeranno il nome vuoto. Gli spazi bianchi non contano come parte del cookie. I valori possono anche essere racchiusi tra virgolette doppie ( "). I valori possono anche contenere =. Ad esempio, formula=5+3=8è un cookie valido.
/**
* @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 non ti aspetti nomi duplicati, puoi convertirlo in un oggetto che semplifica le cose. Quindi è possibile accedere come object.myCookieNameper ottenere il valore. Se ti aspetti duplicati, allora vuoi farlo scorrere cookieEntries. I browser alimentano i cookie con priorità decrescente, pertanto l'inversione garantisce che nell'oggetto venga visualizzato il cookie con priorità più alta. (Il .slice()per evitare la mutazione dell'array.)
Impostazioni cookie
La "scrittura" dei cookie viene eseguita utilizzando l' Set-Cookieintestazione nella risposta. L' response.headers['Set-Cookie']oggetto è in realtà un array, quindi ti spingerai ad esso. Accetta una stringa ma ha più valori di solo namee value. La parte più difficile è scrivere la stringa, ma questo può essere fatto in una riga.
/**
* @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);
Ricorda che puoi impostare più cookie perché puoi effettivamente impostare più Set-Cookieintestazioni nella tua richiesta. Ecco perché è un array.
Nota sulle librerie esterne:
Se si decide di utilizzare la express,, cookie-parsero cookie, notare che hanno valori predefiniti non standard. I cookie analizzati sono sempre decodificati URI (decodificati in percentuale). Ciò significa che se si utilizza un nome o un valore con uno dei seguenti caratteri: !#$%&'()*+/:<=>?@[]^`{|}verranno gestiti in modo diverso con tali librerie. Se stai impostando i cookie, vengono codificati %{HEX}. E se stai leggendo un cookie devi decodificarli.
Ad esempio, mentre email=name@domain.comè un cookie valido, queste librerie lo codificheranno come email=name%40domain.com. La decodifica può presentare problemi se si utilizza il %cookie. Verrà rovinato. Ad esempio, il tuo cookie che era: secretagentlevel=50%007and50%006diventasecretagentlevel=507and506 . Questo è un caso limite, ma qualcosa da notare se si cambia libreria.
Inoltre, su queste librerie, i cookie sono impostati con un valore predefinito, il path=/che significa che vengono inviati su ogni richiesta url all'host.
Se vuoi codificare o decodificare questi valori tu stesso, puoi usare encodeURIComponento decodeURIComponent, rispettivamente.
Riferimenti:
Informazioni aggiuntive:
=segno uguale ( ) come in uno dei cookie di Facebook comefbm_1234123412341234=base_domain=.domain.com.