Lassen Sie mich diesen Teil der Frage wiederholen, den die Antworten hier ignorieren:
Kann dies in wenigen Codezeilen erfolgen, ohne dass eine Drittanbieter-Bibliothek abgerufen werden muss?
Cookies lesen
Cookies werden aus Anfragen mit dem Cookie
Header gelesen . Sie enthalten nur ein name
und value
. Aufgrund der Funktionsweise von Pfaden können mehrere gleichnamige Cookies gesendet werden. In NodeJS werden alle Cookies als eine Zeichenfolge angezeigt, wenn sie im Cookie
Header gesendet werden . Sie teilen sie mit ;
. Sobald Sie einen Cookie haben, ist alles links von den Gleichen (falls vorhanden) das name
, und alles danach ist das value
. Einige Browser akzeptieren ein Cookie ohne Gleichheitszeichen und nehmen an, dass der Name leer ist. Leerzeichen zählen nicht als Teil des Cookies. Werte können auch in doppelte Anführungszeichen gesetzt werden ( "
). Werte können auch enthalten =
. Zum Beispiel formula=5+3=8
ist ein gültiger 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());
Wenn Sie keine doppelten Namen erwarten, können Sie in ein Objekt konvertieren, was die Arbeit erleichtert. Dann können Sie gerne object.myCookieName
darauf zugreifen , um den Wert zu erhalten. Wenn Sie Duplikate erwarten, möchten Sie diese durchlaufen cookieEntries
. Browser füttern Cookies mit absteigender Priorität. Durch das Umkehren wird sichergestellt, dass das Cookie mit der höchsten Priorität im Objekt angezeigt wird. (Dies .slice()
soll eine Mutation des Arrays vermeiden.)
Einstellungen Cookies
Das "Schreiben" von Cookies erfolgt mithilfe des Set-Cookie
Headers in Ihrer Antwort. Das response.headers['Set-Cookie']
Objekt ist eigentlich ein Array, also werden Sie darauf drängen. Es akzeptiert eine Zeichenfolge, hat jedoch mehr Werte als nur name
und value
. Der schwierigste Teil ist das Schreiben der Zeichenfolge, dies kann jedoch in einer Zeile erfolgen.
/**
* @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);
Denken Sie daran, dass Sie mehrere Cookies setzen können, da Sie Set-Cookie
in Ihrer Anfrage tatsächlich mehrere Header setzen können. Deshalb ist es ein Array.
Hinweis zu externen Bibliotheken:
Wenn Sie sich entscheiden , die verwenden express
, cookie-parser
oder cookie
stellen sie Standardwerte haben , die nicht Standard sind. Die analysierten Cookies sind immer URI-dekodiert (prozentual dekodiert). Das heißt, wenn Sie einen Namen oder Wert verwenden, der eines der folgenden Zeichen enthält: !#$%&'()*+/:<=>?@[]^`{|}
Diese werden in diesen Bibliotheken unterschiedlich behandelt. Wenn Sie Cookies setzen, werden diese mit codiert%{HEX}
. Und wenn Sie einen Cookie lesen, müssen Sie ihn entschlüsseln.
Während es sich beispielsweise email=name@domain.com
um ein gültiges Cookie handelt, codieren diese Bibliotheken es als email=name%40domain.com
. Das Dekodieren kann Probleme verursachen, wenn Sie das %
in Ihrem Cookie verwenden. Es wird verstümmelt. Zum Beispiel wird Ihr Cookie, das war: secretagentlevel=50%007and50%006
wird secretagentlevel=507and506
. Das ist ein Randfall, aber etwas zu beachten, wenn Bibliotheken gewechselt werden.
Außerdem werden in diesen Bibliotheken Cookies mit einer Standardeinstellung festgelegt, path=/
was bedeutet, dass sie bei jeder URL-Anforderung an den Host gesendet werden.
Wenn Sie diese Werte selbst zu kodieren oder entschlüsseln möchten, können Sie verwenden , encodeURIComponent
oder decodeURIComponent
, respectively.
Verweise:
Zusätzliche Information:
=
) wie in einem der Facebook-Cookies wie enthältfbm_1234123412341234=base_domain=.domain.com
.