Permettez-moi de répéter cette partie de la question dont les réponses ici ignorent:
Cela peut-il être fait en quelques lignes de code, sans avoir besoin de tirer une bibliothèque tierce?
Lire les cookies
Les cookies sont lus à partir des demandes avec l'en- Cookie
tête. Ils incluent uniquement un name
et value
. En raison du fonctionnement des chemins, plusieurs cookies du même nom peuvent être envoyés. Dans NodeJS, tous les cookies sont en une seule chaîne lorsqu'ils sont envoyés dans l'en- Cookie
tête. Vous les avez séparés ;
. Une fois que vous avez un cookie, tout ce qui se trouve à gauche de l'égal (si présent) est le name
, et tout ce qui suit est le value
. Certains navigateurs acceptent un cookie sans signe égal et présument que le nom est vide. Les espaces ne comptent pas comme faisant partie du cookie. Les valeurs peuvent également être placées entre guillemets ( "
). Les valeurs peuvent également contenir =
. Par exemple, formula=5+3=8
est un cookie valide.
/**
* @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 vous n'attendez pas de noms dupliqués, vous pouvez convertir en un objet, ce qui facilite les choses. Ensuite, vous pouvez accéder à comme object.myCookieName
pour obtenir la valeur. Si vous prévoyez des doublons, vous souhaitez effectuer une itération cookieEntries
. Les navigateurs alimentent les cookies par ordre de priorité décroissante, donc l'inversion garantit que le cookie de priorité la plus élevée apparaît dans l'objet. (Le but .slice()
est d'éviter la mutation du tableau.)
Cookies de paramètres
"L'écriture" des cookies se fait en utilisant l'en- Set-Cookie
tête dans votre réponse. L' response.headers['Set-Cookie']
objet est en fait un tableau, vous y pousserez donc. Il accepte une chaîne mais a plus de valeurs que juste name
et value
. Le plus difficile est d'écrire la chaîne, mais cela peut être fait en une seule ligne.
/**
* @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);
N'oubliez pas que vous pouvez définir plusieurs cookies, car vous pouvez en fait définir plusieurs en- Set-Cookie
têtes dans votre demande. C'est pourquoi c'est un tableau.
Remarque sur les bibliothèques externes:
Si vous décidez d'utiliser le express
,, cookie-parser
ou cookie
, notez que leurs valeurs par défaut ne sont pas standard. Les cookies analysés sont toujours décodés par URI (décodés en pourcentage). Cela signifie que si vous utilisez un nom ou une valeur !#$%&'()*+/:<=>?@[]^`{|}
contenant l' un des caractères suivants: ils seront traités différemment avec ces bibliothèques. Si vous définissez des cookies, ils sont encodés avec%{HEX}
. Et si vous lisez un cookie, vous devez le décoder.
Par exemple, tant que email=name@domain.com
est un cookie valide, ces bibliothèques l'encoderont comme email=name%40domain.com
. Le décodage peut présenter des problèmes si vous utilisez le %
dans votre cookie. Ça va être mutilé. Par exemple, votre cookie qui était: secretagentlevel=50%007and50%006
devient secretagentlevel=507and506
. C'est un cas limite, mais quelque chose à noter en cas de changement de bibliothèque.
De plus, sur ces bibliothèques, les cookies sont définis par défaut, path=/
ce qui signifie qu'ils sont envoyés à chaque demande d'URL à l'hôte.
Si vous souhaitez encoder ou décoder ces valeurs vous-même, vous pouvez utiliser respectivement encodeURIComponent
ou decodeURIComponent
.
Références:
Information additionnelle:
=
signe égal ( ) comme dans l'un des cookies de Facebook commefbm_1234123412341234=base_domain=.domain.com
.