วิธีการตั้งค่าคุกกี้ในโหนด js โดยใช้กรอบงานด่วน?


161

ในแอปพลิเคชันของฉันฉันต้องตั้งค่าคุกกี้โดยใช้ express framework ฉันลองใช้รหัสต่อไปนี้แล้ว แต่ไม่ได้ตั้งค่าคุกกี้

ใครสามารถช่วยฉันทำสิ่งนี้ได้บ้าง

var express = require('express'), http = require('http');
var app = express();
app.configure(function(){
      app.use(express.cookieParser());
      app.use(express.static(__dirname + '/public'));

      app.use(function (req, res) {
           var randomNumber=Math.random().toString();
           randomNumber=randomNumber.substring(2,randomNumber.length);
           res.cookie('cokkieName',randomNumber, { maxAge: 900000, httpOnly: true })

           console.log('cookie have created successfully');
      });

});

var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(5555);

คุณจะตรวจสอบว่าคุกกี้ไม่ได้ตั้งค่าได้อย่างไร คุณได้ตรวจสอบส่วนหัวการตอบสนองที่เบราว์เซอร์ได้รับแล้วหรือยัง?
NilsH

@NilsH ฉันได้เพิ่มเข้าสู่ระบบ statement.if ตั้งหมายความว่ามันจะแสดงเป็น 'คุกกี้ได้สร้าง susccessfully' ..
ชิน

1
ตกลงแล้วมิดเดิลแวร์ของคุณจะไม่ถูกเรียกใช้หรือคำสั่งก่อนหน้านี้บางข้อยกเว้น
NilsH

ถ้าฉันลบ 'app.use (express.static (__ dirname +' / สาธารณะ '));' บรรทัดนี้หมายความว่ามันตั้งคุกกี้
sachin

คำตอบ:


216

ลำดับที่คุณใช้มิดเดิลแวร์ในเรื่อง Express: มิดเดิลแวร์ที่ประกาศไว้ก่อนหน้านี้จะถูกเรียกก่อนและถ้ามันสามารถจัดการการร้องขอมิดเดิลแวร์ใด ๆ ที่ประกาศในภายหลังจะไม่ถูกเรียก

หากexpress.staticจัดการคำขอคุณต้องย้ายมิดเดิลแวร์ของคุณ:

// need cookieParser middleware before we can do anything with cookies
app.use(express.cookieParser());

// set a cookie
app.use(function (req, res, next) {
  // check if client sent cookie
  var cookie = req.cookies.cookieName;
  if (cookie === undefined) {
    // no: set a new cookie
    var randomNumber=Math.random().toString();
    randomNumber=randomNumber.substring(2,randomNumber.length);
    res.cookie('cookieName',randomNumber, { maxAge: 900000, httpOnly: true });
    console.log('cookie created successfully');
  } else {
    // yes, cookie was already present 
    console.log('cookie exists', cookie);
  } 
  next(); // <-- important!
});

// let static middleware do its job
app.use(express.static(__dirname + '/public'));

นอกจากนี้ความต้องการตัวกลางทั้งสิ้นคำขอ (โดยการส่งกลับตอบกลับ) หรือผ่านการร้องขอไปยังตัวกลางต่อไป ในกรณีนี้ฉันทำเสร็จแล้วโดยการโทรnext()เมื่อมีการตั้งค่าคุกกี้

ปรับปรุง

ณ ตอนนี้ตัวแยกวิเคราะห์คุกกี้เป็นแพ็คเกจ npm แยกต่างหากดังนั้นแทนที่จะใช้

app.use(express.cookieParser());

คุณต้องติดตั้งแยกต่างหากโดยใช้npm i cookie-parserจากนั้นใช้เป็น:

const cookieParser = require('cookie-parser');
app.use(cookieParser());

นอกจากนี้ผมมีอีกหนึ่งคำถามว่าฉันสามารถตรวจสอบว่า cokkie จะมีอยู่หรือไม่ก่อนที่จะตั้งคุกกี้
ชิน

ฉันแก้ไขคำตอบเพื่อแสดงวิธีการตรวจสอบว่ามีการตั้งค่าคุกกี้ไว้แล้ว
robertklep

1
คุณอาจมีไฟล์ JS และ / หรือ CSS ในหน้าของคุณ สิ่งเหล่านั้นจะถูกจัดการโดยexpress.staticซึ่งจะจัดการพวกเขาหลังจากมิดเดิลแวร์ ดังนั้นสำหรับไฟล์ JS หรือ CSS แต่ละไฟล์รหัสจะถูกเรียก
robertklep

1
ไม่ได้ตั้งค่าคุกกี้ 8 ครั้ง แต่แจ้งว่ามีคุกกี้อยู่แล้ว ซึ่งคาดว่าจะเป็น
robertklep

14
โปรดทราบว่าตอนนี้ควรติดตั้งตัวแยกวิเคราะห์คุกกี้แยกกัน ดูnpmjs.com/package/cookie-parser
Joshua

118

ตั้งค่าคุกกี้หรือไม่

res.cookie('cookieName', 'cookieValue')

อ่านคุกกี้?

req.cookies

การสาธิต

const express('express')
    , cookieParser = require('cookie-parser'); // in order to read cookie sent from client

app.get('/', (req,res)=>{

    // read cookies
    console.log(req.cookies) 

    let options = {
        maxAge: 1000 * 60 * 15, // would expire after 15 minutes
        httpOnly: true, // The cookie only accessible by the web server
        signed: true // Indicates if the cookie should be signed
    }

    // Set cookie
    res.cookie('cookieName', 'cookieValue', options) // options is optional
    res.send('')

})

สวัสดีคุณบอกได้มั้ยว่ามีอะไรเซ็น: จริงเหรอ?
titoih

หากคุณแนะนำให้ตั้งค่าคุกกี้เป็นสัญญาณเป็นสิ่งสำคัญที่จะต้องทราบว่า req.cookie จะกลับมาว่างเปล่า คุณสามารถเรียกค้นคุกกี้ที่ลงนามแล้วได้จาก req.signedCookies
ใครบางคนพิเศษ

38

ไม่ตอบคำถามของคุณอย่างแน่นอน แต่ฉันเจอคำถามของคุณในขณะที่มองหาคำตอบสำหรับปัญหาที่ฉันมี อาจช่วยคนอื่นได้

ปัญหาของฉันคือคุกกี้ถูกตั้งค่าในการตอบสนองของเซิร์ฟเวอร์ แต่เบราว์เซอร์ไม่ได้รับการบันทึก

การตอบกลับของเซิร์ฟเวอร์กลับมาพร้อมกับชุดคุกกี้:

Set-Cookie:my_cookie=HelloWorld; Path=/; Expires=Wed, 15 Mar 2017 15:59:59 GMT 

นี่คือวิธีที่ฉันแก้ไขมัน

ฉันใช้fetchในรหัสฝั่งไคลเอ็นต์ หากคุณไม่ได้ระบุcredentials: 'include' ในfetchตัวเลือกคุกกี้จะไม่ถูกส่งไปยังเซิร์ฟเวอร์หรือบันทึกโดยเบราว์เซอร์แม้ว่าการตอบกลับจากเซิร์ฟเวอร์จะตั้งค่าคุกกี้

ตัวอย่าง:

var headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept', 'application/json');

return fetch('/your/server_endpoint', {
    method: 'POST',
    mode: 'same-origin',
    redirect: 'follow',
    credentials: 'include', // Don't forget to specify this if you need cookies
    headers: headers,
    body: JSON.stringify({
        first_name: 'John',
        last_name: 'Doe'
    })
})

ฉันหวังว่านี่จะช่วยใครซักคน


ฉันตรวจสอบคำขอโพสต์ของฉันในเบราว์เซอร์แล้ว แต่ฟิลด์นี้ไม่ไปพร้อมกับคำขอโพสต์?
Sun Garg

หากใช้ XHR หรือ Jquery ให้ใช้ 'withCredentials: true' แทน
ถอดปลั๊ก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.