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 Cookienagłówkiem. Zawierają tylko namei 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 Cookienagłó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=8jest 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.myCookieNameaby 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-Cookienagłó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 namei 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-Cookienagłó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-parseralbo 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.comjest 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%006staje 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 encodeURIComponentlub decodeURIComponent.
Bibliografia:
Dodatkowe informacje:
=znak równości ( ), jak w jednym z plików cookie Facebooka, takich jakfbm_1234123412341234=base_domain=.domain.com.