Saya ingin dapat menetapkan satu cookie, dan membaca cookie tunggal itu dengan setiap permintaan yang dibuat ke instance server nodejs. Bisakah itu dilakukan dalam beberapa baris kode, tanpa perlu menarik lib pihak ketiga?
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/');
Hanya mencoba mengambil kode di atas secara langsung dari nodejs.org, dan menjalankan cookie ke dalamnya.
javascript
cookies
node.js
Corey Hart
sumber
sumber
=
) seperti di salah satu cookie Facebook sepertifbm_1234123412341234=base_domain=.domain.com
.;
saat itu dengan contoh pertama dari=
. Kiri adalah kunci, kanan adalah nilai.parts[0]
keparts.shift()
danparts[1]
keparts.join('=')
Jika Anda menggunakan pustaka cepat, seperti yang dilakukan banyak pengembang node.js, ada cara yang lebih mudah. Periksa halaman dokumentasi Express.js untuk informasi lebih lanjut.
Contoh parsing di atas berfungsi tetapi express memberi Anda fungsi yang bagus untuk mengatasinya:
Untuk mengatur cookie:
Untuk menghapus cookie:
sumber
cookie-parser
tidak lagi menjadi bagian dari express dan / atau connect, tetapi tersedia sebagai middleware: github.com/expressjs/cookie-parserRevNoah memiliki jawaban terbaik dengan saran menggunakan pengurai cookie Express . Tapi, jawaban itu sekarang sudah 3 tahun dan ketinggalan zaman.
Menggunakan Express , Anda dapat membaca cookie sebagai berikut
Dan perbarui
package.json
dengan yang berikut, gantikan versi yang relatif terbaru yang sesuai.Lebih banyak operasi seperti pengaturan dan penguraian cookie dijelaskan di sini dan di sini
sumber
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
Sebagai tambahan untuk jawaban @Corey Hart, saya telah menulis ulang
parseCookies()
menggunakan:Ini contoh kerjanya:
Saya juga mencatat bahwa OP menggunakan modul http. Jika OP menggunakan restify , ia dapat menggunakan cookies restify :
sumber
let/const
danstringifyCookies
bisa menjadi satu baris denganmap
bukannya membangun array dengan cara itu.Anda dapat menggunakan modul "cookies" npm, yang memiliki serangkaian fitur lengkap.
Dokumentasi dan contoh di:
https://github.com/jed/cookies
sumber
Untuk mendapatkan pembagi cookie agar berfungsi dengan cookie yang memiliki '=' dalam nilai cookie:
lalu untuk mendapatkan satu cookie:
sumber
Cookie ditransfer melalui HTTP-Header
Anda hanya perlu menguraikan header-permintaan dan meletakkan header-respons.
sumber
Ini tambalan copy-n-paste yang rapi untuk mengelola cookie di node Saya akan melakukan ini dalam CoffeeScript, untuk kecantikan.
Sekarang Anda dapat menangani cookie seperti yang Anda harapkan:
sumber
Izinkan saya mengulangi bagian pertanyaan ini yang diabaikan oleh jawaban di sini:
Membaca Cookie
Cookie dibaca dari permintaan dengan
Cookie
tajuk. Mereka hanya menyertakan aname
danvalue
. Karena cara kerja jalur, beberapa cookie dengan nama yang sama dapat dikirim. Di NodeJS, semua Cookies dalam satu string saat dikirim diCookie
header. Anda membaginya dengan;
. Setelah Anda memiliki cookie, semua yang ada di sebelah kiri sama dengan (jika ada) adalahname
, dan semuanya adalahvalue
. 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.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 mengulanginyacookieEntries
. 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. Theresponse.headers['Set-Cookie']
objek sebenarnya sebuah array, sehingga Anda akan mendorong untuk itu. Ini menerima string tetapi memiliki nilai lebih dari sekadarname
danvalue
. Bagian tersulit adalah menulis string, tetapi ini bisa dilakukan dalam satu baris.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
ataucookie
, 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 protected]
cookie yang valid, pustaka ini akan menyandikannya sebagaiemail=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
menjadisecretagentlevel=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
ataudecodeURIComponent
, masing-masing.Referensi:
Informasi tambahan:
sumber
Yang pertama perlu membuat cookie (saya telah memasukkan token di dalam cookie sebagai contoh) dan kemudian mengaturnya sebagai respons. Untuk menggunakan cookie dengan cara berikut, instal cookieParser
Browser akan menyimpannya di tab 'Sumber Daya' dan akan digunakan untuk setiap permintaan setelah itu mengambil URL awal sebagai basis
Untuk mendapatkan cookie dari permintaan di sisi server juga mudah. Anda harus mengekstrak cookie dari permintaan dengan memanggil properti 'cookie' dari objek permintaan.
sumber
Jika Anda tidak peduli apa yang ada di
cookie
dalamnya dan Anda hanya ingin menggunakannya, coba pendekatan bersih ini dengan menggunakanrequest
(modul simpul populer):sumber
jar()
beberapa nama metode imut untuk mendapatkan daftar cookie saat ini? Apa gunanya 2 permintaan permintaan? Ini sebagian besar merupakan iklan, bukan jawaban.sumber
Menggunakan Beberapa ES5 / 6 Sihir & RegEx Magic
Berikut adalah opsi untuk membaca cookie dan mengubahnya menjadi objek Key, Pasangan nilai untuk sisi klien, juga dapat menggunakannya di sisi server.
Catatan : Jika ada
=
nilai, jangan khawatir. Jika ada=
kunci, masalah di surga.Lebih Banyak Catatan : Beberapa orang mungkin berpendapat keterbacaan jadi hancurkan sesuai keinginan.
Saya Suka Catatan : Menambahkan penangan kesalahan (coba tangkap) tidak ada salahnya.
Apa yang sedang terjadi?
iLikeCookies()
akan membagi cookie dengan;
( spasi setelah;
):Kemudian kami memetakan array itu dan membaginya dengan kemunculan pertama
=
menggunakan regex capturing parens :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Kemudian gunakan teman kita `Object.fromEntries untuk menjadikan ini objek kunci, pasangan val.
Suara
sumber
Saya menulis fungsi sederhana ini hanya lulus
req.headers.cookie
dan nama cookiesumber