Powtórzę tę część pytania, na które odpowiedzi tutaj ignorują:
Czy można to zrobić w kilku wierszach kodu, bez konieczności pobierania biblioteki innej firmy?
Czytanie plików cookie
Pliki cookie są odczytywane z żądań z Cookie
nagłówkiem. Zawierają tylko name
i value
. Ze względu na sposób działania ścieżek można wysłać wiele plików cookie o tej samej nazwie. W NodeJS wszystkie pliki cookie w postaci jednego ciągu, gdy są wysyłane w Cookie
nagłówku. Dzielisz ich z ;
. Gdy masz plik cookie, wszystko po lewej stronie równa się (jeśli występuje) to name
, a wszystko po nim to value
. Niektóre przeglądarki akceptują plik cookie bez znaku równości i zakładają, że nazwa jest pusta. Spacje nie są liczone jako część pliku cookie. Wartości można również zawijać w podwójne cudzysłowy ( "
). Wartości mogą również zawierać =
. Na przykład formula=5+3=8
jest prawidłowym plikiem 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());
Jeśli nie spodziewasz się zduplikowanych nazw, możesz przekonwertować je na obiekt, co ułatwi sprawę. Następnie możesz uzyskać dostęp, object.myCookieName
aby uzyskać wartość. Jeśli spodziewasz się duplikatów, chcesz powtórzyć cookieEntries
. Przeglądarki podają pliki cookie w malejącym priorytecie, więc cofanie zapewnia, że w obiekcie pojawia się plik cookie o najwyższym priorytecie. (Ma .slice()
to na celu uniknięcie mutacji tablicy).
Ustawienia plików cookie
„Zapisywanie” plików cookie odbywa się za pomocą Set-Cookie
nagłówka w Twojej odpowiedzi. response.headers['Set-Cookie']
Obiekt jest rzeczywiście tablicą, więc będziesz popychanie do niego. Akceptuje ciąg, ale ma więcej wartości niż tylko name
i value
. Najtrudniejszą częścią jest napisanie ciągu, ale można to zrobić w jednej linii.
/**
* @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);
Pamiętaj, że możesz ustawić wiele plików cookie, ponieważ w rzeczywistości możesz ustawić wiele Set-Cookie
nagłówków w swoim żądaniu. Dlatego jest to tablica.
Uwaga dotycząca bibliotek zewnętrznych:
Jeśli użytkownik zdecyduje się użyć express
, cookie-parser
albo cookie
, trzeba pamiętać, że mają wartości domyślne, które są niestandardowe. Analizowane pliki cookie są zawsze dekodowane w postaci URI (dekodowane procentowo). Oznacza to, że jeśli użyjesz nazwy lub wartości, która zawiera którykolwiek z następujących znaków: !#$%&'()*+/:<=>?@[]^`{|}
będą one obsługiwane inaczej w tych bibliotekach. Jeśli ustawiasz pliki cookie, są one kodowane za pomocą%{HEX}
. A jeśli czytasz plik cookie, musisz je zdekodować.
Na przykład, chociaż email=name@domain.com
jest to prawidłowy plik cookie, te biblioteki zakodują go jako plik email=name%40domain.com
. Dekodowanie może powodować problemy, jeśli używasz %
pliku cookie. Zostanie zmiażdżony. Na przykład Twój plik cookie, który był: secretagentlevel=50%007and50%006
staje się secretagentlevel=507and506
. To skrajny przypadek, ale coś, na co należy zwrócić uwagę, jeśli zmieniasz biblioteki.
Ponadto w tych bibliotekach pliki cookie mają ustawienie domyślne, path=/
co oznacza, że są wysyłane przy każdym żądaniu adresu URL do hosta.
Jeśli chcesz samodzielnie zakodować lub zdekodować te wartości, możesz użyć odpowiednio encodeURIComponent
lub decodeURIComponent
.
Bibliografia:
Dodatkowe informacje:
=
znak równości ( ), jak w jednym z plików cookie Facebooka, takich jakfbm_1234123412341234=base_domain=.domain.com
.