Chcę móc ustawić pojedynczy plik cookie i odczytać ten pojedynczy plik cookie przy każdym żądaniu wysyłanym do instancji serwera nodejs. Czy można to zrobić w kilku wierszach kodu, bez konieczności pobierania biblioteki innej firmy?
var http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end('Hello World\n');
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
Po prostu próbuję pobrać powyższy kod bezpośrednio z nodejs.org i umieścić w nim plik cookie.
javascript
cookies
node.js
Corey Hart
źródło
źródło
=
znak równości ( ), jak w jednym z plików cookie Facebooka, takich jakfbm_1234123412341234=base_domain=.domain.com
.;
tego czasu przez pierwsze wystąpienie=
. Lewy to klucz, prawy to wartość.parts[0]
naparts.shift()
iparts[1]
naparts.join('=')
Jeśli używasz biblioteki Express, tak jak robi to wielu programistów node.js, jest łatwiejszy sposób. Sprawdź stronę dokumentacji Express.js, aby uzyskać więcej informacji.
Powyższy przykład parsowania działa, ale express daje ci fajną funkcję, aby się tym zająć:
Aby ustawić plik cookie:
Aby wyczyścić plik cookie:
źródło
cookie-parser
nie jest już częścią Express i / lub Connect, ale jest dostępny jako oprogramowanie pośredniczące: github.com/expressjs/cookie-parserRevNoah miał najlepszą odpowiedź, sugerując użycie parsera plików cookie Express . Ale ta odpowiedź ma teraz 3 lata i jest nieaktualna.
Korzystając z Express , możesz odczytać plik cookie w następujący sposób
I zaktualizuj swoją
package.json
następującą, zastępując odpowiednie względnie najnowsze wersje.Więcej operacji, takich jak ustawianie i analizowanie plików cookie, opisano tutaj i tutaj
źródło
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
Jako rozszerzenie odpowiedzi @Corey Hart, przepisałem
parseCookies()
użycie:Oto działający przykład:
Zwracam również uwagę, że OP korzysta z modułu http. Jeśli OP używał restify , może skorzystać restify-cookies :
źródło
let/const
istringifyCookies
może być wypełniony amap
zamiast budować tablicę w ten sposób.Możesz skorzystać z modułu „cookies” npm, który posiada rozbudowany zestaw funkcji.
Dokumentacja i przykłady na:
https://github.com/jed/cookies
źródło
Aby ustawić rozdzielacz plików cookie do pracy z plikami cookie, które mają w wartościach cookie `` = '':
następnie, aby uzyskać indywidualny plik cookie:
źródło
Pliki cookie są przesyłane przez nagłówki HTTP.
Będziesz musiał tylko przeanalizować nagłówki żądań i umieścić nagłówki odpowiedzi.
źródło
Oto zgrabna łatka kopiuj-wklej do zarządzania plikami cookie w węźle. Zrobię to w CoffeeScript, dla piękna.
Teraz możesz obsługiwać pliki cookie zgodnie z oczekiwaniami:
źródło
Powtórzę tę część pytania, na które odpowiedzi tutaj ignorują:
Czytanie plików cookie
Pliki cookie są odczytywane z żądań z
Cookie
nagłówkiem. Zawierają tylkoname
ivalue
. 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 wCookie
nagłówku. Dzielisz ich z;
. Gdy masz plik cookie, wszystko po lewej stronie równa się (jeśli występuje) toname
, a wszystko po nim tovalue
. 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ładformula=5+3=8
jest prawidłowym plikiem cookie.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ż tylkoname
ivalue
. Najtrudniejszą częścią jest napisanie ciągu, ale można to zrobić w jednej linii.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
albocookie
, 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 protected]
jest to prawidłowy plik cookie, te biblioteki zakodują go jako plikemail=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
lubdecodeURIComponent
.Bibliografia:
Dodatkowe informacje:
źródło
Najpierw należy utworzyć ciasteczko (jako przykład zawiniłem token wewnątrz ciasteczka), a następnie ustawić w odpowiedzi. Aby użyć ciasteczka w następujący sposób zainstaluj cookieParser
Przeglądarka zapisze go na karcie „Zasoby” i będzie używany do każdego żądania, przyjmując początkowy adres URL jako podstawę
Uzyskanie pliku cookie z żądania po stronie serwera jest również łatwe. Musisz wyodrębnić plik cookie z żądania, wywołując właściwość „cookie” obiektu żądania.
źródło
Jeśli nie obchodzi cię, co jest w środku
cookie
i po prostu chcesz z tego skorzystać, wypróbuj to czyste podejście za pomocąrequest
(popularnego modułu węzłowego):źródło
jar()
jakaś urocza nazwa metody, aby uzyskać aktualną listę plików cookie? Jaki jest sens dwóch wezwań prośby? To głównie reklama, a nie odpowiedź.źródło
Korzystanie z niektórych ES5 / 6 Sorcery & RegEx Magic
Tutaj jest opcja, aby odczytać pliki cookie i przekształcić je w obiekt pary klucz, wartość po stronie klienta, można go również użyć po stronie serwera.
Uwaga : jeśli
=
w wartości jest a , nie martw się. Jeśli jest=
w kluczu, kłopoty w raju.Więcej uwag : Niektórzy mogą twierdzić, że czytelność jest czytelna, więc podziel ją według własnego uznania.
Lubię notatki : Dodanie modułu obsługi błędów (spróbuj złapać) nie zaszkodzi.
Co się dzieje?
iLikeCookies()
podzieli pliki cookie według;
( spacja po;
):Następnie mapujemy tę tablicę i dzielimy na pierwsze wystąpienie
=
użycia par do przechwytywania wyrażeń regularnych :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Następnie użyj naszego przyjaciela `Object.fromEntries, aby uczynić ten obiekt parami klucz, wartości.
Nooice.
źródło
Napisałem tę prostą funkcję po prostu podaj
req.headers.cookie
i nazwę pliku cookieźródło