मुझे इस प्रश्न के इस भाग को दोहराना चाहिए जो यहाँ उत्तर दे रहा है:
क्या इसे थर्ड पार्टी लिब में खींचने की आवश्यकता के बिना कोड की कुछ पंक्तियों में किया जा सकता है?
कुकीज़ पढ़ना
Cookie
हेडर के साथ अनुरोधों से कुकीज़ पढ़ी जाती हैं । वे केवल एक name
और शामिल हैं value
। जिस तरह से रास्ते काम करते हैं, उसी नाम के कई कुकीज़ भेजे जा सकते हैं। NodeJS में, Cookie
हेडर में भेजे जाने वाले सभी तार एक ही स्ट्रिंग में । आप उनसे बिछड़ गए ;
। एक बार जब आप एक कुकी, बराबर के बाईं ओर सब कुछ (यदि वर्तमान) है name
, और सब कुछ के बाद है value
। कुछ ब्राउज़र कुकी को बिना किसी समान चिह्न के स्वीकार करेंगे और नाम को रिक्त मानेंगे। व्हॉट्सएप कुकी के हिस्से के रूप में नहीं गिना जाता है। मूल्यों को दोहरे उद्धरण चिह्नों ( "
) में भी लपेटा जा सकता है । मान भी हो सकते हैं =
। उदाहरण के लिए, formula=5+3=8
एक वैध कुकी है।
/**
* @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());
यदि आप डुप्लिकेट किए गए नामों की अपेक्षा नहीं कर रहे हैं, तो आप एक ऑब्जेक्ट में बदल सकते हैं जो चीजों को आसान बनाता है। फिर आप object.myCookieName
मूल्य प्राप्त करने के लिए जैसे पहुंच सकते हैं । यदि आप डुप्लिकेट की अपेक्षा कर रहे हैं, तो आप इसके माध्यम से पुनरावृति करना चाहते हैं cookieEntries
। ब्राउज़र कुकीज़ को नीचे उतरने की प्राथमिकता में खिलाते हैं, इसलिए पीछे हटना सुनिश्चित करता है कि सर्वोच्च प्राथमिकता कुकी वस्तु में दिखाई दे। ( .slice()
सरणी के उत्परिवर्तन से बचने के लिए है।)
सेटिंग्स कुकीज़
"लेखन" कुकीज़ Set-Cookie
आपकी प्रतिक्रिया में हेडर का उपयोग करके किया जाता है । response.headers['Set-Cookie']
वस्तु वास्तव में एक सरणी है, तो आप इसे करने के लिए जोर दे रहे होंगे। यह एक स्ट्रिंग को स्वीकार करता है लेकिन इसमें अधिक मूल्य हैं बस name
और value
। सबसे कठिन हिस्सा स्ट्रिंग लिख रहा है, लेकिन यह एक पंक्ति में किया जा सकता है।
/**
* @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);
याद रखें कि आप कई कुकीज़ सेट कर सकते हैं, क्योंकि आप वास्तव Set-Cookie
में अपने अनुरोध में कई हेडर सेट कर सकते हैं। इसलिए यह एक सरणी है।
बाहरी पुस्तकालयों पर ध्यान दें:
आप उपयोग करना चाहते हैं express
, cookie-parser
या cookie
, ध्यान दें कि वे चूक कि अमानक हैं। कुकीज हमेशा यूआरआई डिकोडेड (प्रतिशत-डिकोडेड) होती हैं। इसका मतलब है कि यदि आप एक नाम या मान का उपयोग करते हैं, जिसमें निम्न में से कोई भी वर्ण है: तो !#$%&'()*+/:<=>?@[]^`{|}
उन्हें उन पुस्तकालयों के साथ अलग तरीके से संभाला जाएगा। यदि आप कुकीज़ सेट कर रहे हैं, तो वे इनकोडेड हैं %{HEX}
। और अगर आप एक कुकी पढ़ रहे हैं तो आपको उन्हें डिकोड करना होगा।
उदाहरण के लिए, जबकि email=name@domain.com
एक वैध कुकी है, इन पुस्तकालयों के रूप में इसे सांकेतिक शब्दों में बदलना होगा email=name%40domain.com
। यदि आप %
अपनी कुकी में उपयोग कर रहे हैं तो डिकोडिंग मुद्दों को प्रदर्शित कर सकता है । यह आम हो जाएगा। उदाहरण के लिए, आपका कुकी जो था: secretagentlevel=50%007and50%006
बन जाता है secretagentlevel=507and506
। यह एक किनारे का मामला है, लेकिन पुस्तकालयों को स्विच करने पर ध्यान देने योग्य कुछ है।
इसके अलावा, इन पुस्तकालयों पर, कुकीज़ को डिफ़ॉल्ट रूप से सेट किया जाता है, path=/
जिसका अर्थ है कि वे होस्ट के लिए हर यूआरएल अनुरोध पर भेजे जाते हैं।
यदि आप इन मानों को अपने आप एनकोड या डीकोड करना चाहते हैं, तो आप क्रमशः, encodeURIComponent
या उपयोग कर सकते decodeURIComponent
हैं।
संदर्भ:
अतिरिक्त जानकारी:
=
में फेसबुक के कुकीज़ में से एक के बराबर ( ) चिन्ह शामिल हैfbm_1234123412341234=base_domain=.domain.com
।