Izinkan saya mengulangi bagian pertanyaan ini yang diabaikan oleh jawaban di sini:
Bisakah itu dilakukan dalam beberapa baris kode, tanpa perlu menarik lib pihak ketiga?
Membaca Cookie
Cookie dibaca dari permintaan dengan Cookie
tajuk. Mereka hanya menyertakan a name
dan value
. Karena cara kerja jalur, beberapa cookie dengan nama yang sama dapat dikirim. Di NodeJS, semua Cookies dalam satu string saat dikirim di Cookie
header. Anda membaginya dengan ;
. Setelah Anda memiliki cookie, semua yang ada di sebelah kiri sama dengan (jika ada) adalah name
, dan semuanya adalah value
. Beberapa browser akan menerima cookie tanpa tanda yang sama dan menganggap namanya kosong. Spasi putih tidak dihitung sebagai bagian dari cookie. Nilai juga dapat dibungkus dengan tanda kutip ganda ( "
). Nilai juga bisa mengandung =
. Misalnya, formula=5+3=8
adalah cookie yang valid.
/**
* @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());
Jika Anda tidak mengharapkan nama yang digandakan, maka Anda dapat mengonversi ke objek yang mempermudah. Maka Anda dapat mengakses suka object.myCookieName
untuk mendapatkan nilai. Jika Anda mengharapkan duplikat, maka Anda ingin mengulanginya cookieEntries
. Browser memberi makan cookie dalam prioritas menurun, jadi membalikkan memastikan cookie prioritas tertinggi muncul di objek. ( .slice()
Adalah untuk menghindari mutasi array.)
Pengaturan Cookie
Cookie "Menulis" dilakukan dengan menggunakan Set-Cookie
tajuk di respons Anda. The response.headers['Set-Cookie']
objek sebenarnya sebuah array, sehingga Anda akan mendorong untuk itu. Ini menerima string tetapi memiliki nilai lebih dari sekadar name
dan value
. Bagian tersulit adalah menulis string, tetapi ini bisa dilakukan dalam satu baris.
/**
* @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);
Ingat Anda dapat mengatur beberapa cookie, karena Anda sebenarnya dapat mengatur beberapa Set-Cookie
header dalam permintaan Anda. Itu sebabnya array.
Catatan tentang perpustakaan eksternal:
Jika Anda memutuskan untuk menggunakan express
, cookie-parser
atau cookie
, perhatikan mereka memiliki default yang non-standar. Cookies yang diurai selalu URI Decoded (persen-decode). Itu berarti jika Anda menggunakan nama atau nilai yang memiliki salah satu karakter berikut: !#$%&'()*+/:<=>?@[]^`{|}
mereka akan ditangani secara berbeda dengan perpustakaan itu. Jika Anda mengatur cookie, mereka dikodekan dengan %{HEX}
. Dan jika Anda membaca cookie Anda harus memecahkan kode mereka.
Misalnya, meskipun email=name@domain.com
cookie yang valid, pustaka ini akan menyandikannya sebagai email=name%40domain.com
. Penguraian kode dapat menunjukkan masalah jika Anda menggunakan %
cookie Anda. Itu akan hancur. Misalnya, cookie Anda yang dulu: secretagentlevel=50%007and50%006
menjadi secretagentlevel=507and506
. Itu kasus tepi, tetapi sesuatu yang perlu diperhatikan jika beralih perpustakaan.
Juga, di perpustakaan ini, cookie diatur dengan default path=/
yang berarti mereka dikirim pada setiap permintaan url ke host.
Jika Anda ingin menyandikan atau mendekode sendiri nilai-nilai ini, Anda dapat menggunakan encodeURIComponent
atau decodeURIComponent
, masing-masing.
Referensi:
Informasi tambahan:
=
) seperti di salah satu cookie Facebook sepertifbm_1234123412341234=base_domain=.domain.com
.