ให้ฉันทำซ้ำส่วนนี้ของคำถามที่คำตอบที่นี่ไม่สนใจ:
มันสามารถทำได้ในไม่กี่บรรทัดของรหัสโดยไม่ต้องดึง lib บุคคลที่สาม?
อ่านคุกกี้
คุกกี้จะถูกอ่านจากคำขอที่มี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
ทราบว่าพวกเขามีค่าเริ่มต้นที่ไม่ได้มาตรฐาน คุกกี้ที่ถูกวิเคราะห์คำจะถูกถอดรหัส URI เสมอ (ถอดรหัสเป็นเปอร์เซ็นต์) ซึ่งหมายความว่าหากคุณใช้ชื่อหรือค่าที่มีอักขระใด ๆ ต่อไปนี้: !#$%&'()*+/:<=>?@[]^`{|}
พวกเขาจะได้รับการจัดการแตกต่างจากไลบรารีเหล่านั้น %{HEX}
หากคุณกำลังตั้งคุกกี้พวกเขาจะถูกเข้ารหัสด้วย และถ้าคุณอ่านคุกกี้คุณต้องถอดรหัสมัน
ยกตัวอย่างเช่นในขณะที่เป็นคุกกี้ที่ถูกต้องห้องสมุดเหล่านี้จะเข้ารหัสเป็นemail=name@domain.com
email=name%40domain.com
การถอดรหัสสามารถแสดงปัญหาได้หากคุณใช้%
ในคุกกี้ของคุณ มันจะได้รับการ mangled ยกตัวอย่างเช่นคุกกี้ของคุณที่ได้รับ: กลายเป็นsecretagentlevel=50%007and50%006
secretagentlevel=507and506
นั่นเป็นกรณีที่มีขอบ แต่มีบางสิ่งที่ควรทราบหากเปลี่ยนไลบรารี
นอกจากนี้ในไลบรารีเหล่านี้คุกกี้จะถูกตั้งค่าเป็นค่าเริ่มต้นpath=/
ซึ่งหมายความว่ามีการส่งคุกกี้ทุกครั้งที่มีการร้องขอไปยังโฮสต์
หากคุณต้องการเข้ารหัสหรือถอดรหัสค่าเหล่านี้ด้วยตัวคุณเองคุณสามารถใช้encodeURIComponent
หรือdecodeURIComponent
ตามลำดับ
อ้างอิง:
ข้อมูลเพิ่มเติม:
=
) เข้าสู่ระบบเป็นหนึ่งในคุกกี้ของ Facebookfbm_1234123412341234=base_domain=.domain.com
เช่น