Burada cevapların görmezden geldiği sorunun bu kısmını tekrarlayayım:
Üçüncü taraf bir lib çekmeye gerek kalmadan birkaç satır kod içinde yapılabilir mi?
Çerezleri Okuma
Çerezler Cookie
başlıklı isteklerden okunur . Sadece bir name
ve içerirler value
. Yolların çalışması nedeniyle, aynı adda birden çok çerez gönderilebilir. NodeJS'de, tüm Çerezler Cookie
başlıkta gönderildikleri gibi tek bir dizede bulunur . Onları ayırdın ;
. Bir çereziniz olduğunda, (varsa) eşitlerin solundaki name
her şey, ve sonraki her şey value
. Bazı tarayıcılar eşit işareti olmayan bir çerezi kabul eder ve adının boş olduğunu varsayar. Beyaz alanlar çerezin bir parçası olarak sayılmaz. Değerler ayrıca çift tırnak işareti ( "
) ile sarılabilir . Değerler de içerebilir =
. Örneğin, formula=5+3=8
geçerli bir çerezdir.
/**
* @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());
Yinelenen adlar beklemiyorsanız, işleri kolaylaştıran bir nesneye dönüştürebilirsiniz. Sonra object.myCookieName
değeri almak için beğenebilirsiniz . Yinelenenleri bekliyorsanız, yineleme yapmak istersiniz cookieEntries
. Tarayıcılar çerezleri azalan önceliğe göre besler, böylece tersine çevirme en yüksek öncelikli çerezin nesnede görünmesini sağlar. (Dizinin .slice()
mutasyonunu önlemek içindir.)
Ayar Çerezleri
"Yazma" çerezleri Set-Cookie
yanıtınızdaki başlık kullanılarak yapılır . response.headers['Set-Cookie']
Nesne aslında bir dizidir, bu nedenle buna bastırıyor olacak. Bir dizeyi kabul eder ancak sadece name
ve değerlerinden daha fazla değere sahiptir value
. En zor kısmı dizeyi yazmak, ancak bu bir satırda yapılabilir.
/**
* @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);
Birden çok çerez ayarlayabileceğinizi unutmayın, çünkü Set-Cookie
isteğinizde aslında birden çok başlık ayarlayabilirsiniz . Bu yüzden bir dizi.
Harici kitaplıklar hakkında not:
, Veya kullanmaya karar verirseniz express
, standart olmayan varsayılan değerleri olduğunu unutmayın. Ayrıştırılan çerezler her zaman URI Kod Çözücüdür (yüzde kod çözme). Bu, aşağıdaki karakterlerden herhangi birine sahip bir ad veya değer kullanırsanız, bu kitaplıklarla farklı şekilde işlenecekleri anlamına gelir . Çerezleri ayarlıyorsanız, bunlar ile kodlanır . Eğer bir çerez okuyorsanız bunları deşifre etmelisiniz.cookie-parser
cookie
!#$%&'()*+/:<=>?@[]^`{|}
%{HEX}
Örneğin, email=name@domain.com
geçerli bir çerez olsa da, bu kütüphaneler onu olarak kodlar email=name%40domain.com
. Eğer %
çerezi içinde kullanıyorsanız kod çözme sorunları gösterebilir . Karışık olacak. Örneğin, olan çereziniz: secretagentlevel=50%007and50%006
olursecretagentlevel=507and506
. Bu bir uç durum, ama kütüphaneleri değiştirirken dikkat edilmesi gereken bir şey.
Ayrıca, bu kütüphanelerde, çerezler varsayılan olarak ayarlanır, path=/
yani her url isteğinde ana bilgisayara gönderilir.
Bu değerleri kendiniz kodlamak veya kodunu çözmek isterseniz , sırasıyla encodeURIComponent
veya kullanabilirsiniz decodeURIComponent
.
Referanslar:
Ek bilgi:
=
, Facebook'un çerezlerinden birinde olduğu gibi eşit ( ) işareti içeriyorsa yukarıdaki kod yanlış çalışırfbm_1234123412341234=base_domain=.domain.com
.