एक्सप्रेस फ्रेम का उपयोग करके नोड जेएस में कुकी कैसे सेट करें?


161

अपने आवेदन में, मुझे एक्सप्रेस फ्रेमवर्क का उपयोग करके कुकी सेट करने की आवश्यकता है। मैंने निम्नलिखित कोड की कोशिश की है, लेकिन यह कुकी सेट नहीं कर रहा है।

क्या कोई मुझे ऐसा करने में मदद कर सकता है?

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
ठीक है, फिर या तो आपके मिडलवेयर को आमंत्रित नहीं किया जाता है, या पिछले बयानों में से कुछ अपवाद देते हैं।
नेल्सह

अगर मैंने 'app.use (express.static (__ dirname +' / public ')) हटा दिया;);) इस पंक्ति का मतलब है कि यह कुकी सेट है
सैचिन

जवाबों:


216

जिस क्रम में आप एक्सप्रेस मामलों में मिडलवेयर का उपयोग करते हैं: पहले घोषित किए गए मिडलवेयर को पहले कॉल किया जाएगा, और यदि वह किसी अनुरोध को संभाल सकता है, तो बाद में घोषित किसी भी मिडलवेयर को कॉल नहीं किया जाएगा।

यदि 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());

मेरे पास एक और सवाल है कि मैं कैसे जांच सकता हूं कि कुकी स्थापित करने से पहले कोकी मौजूद है या नहीं
sachin

मैंने अपने उत्तर को यह दिखाने के लिए संपादित किया है कि कुकी पहले से ही सेट है या नहीं, इसकी जांच कैसे करें।
रॉबर्टक्लेप

1
आपके पास शायद अपने पृष्ठ पर कुछ JS और / या CSS फाइलें हैं। उन लोगों द्वारा नियंत्रित किया express.staticजाएगा, जो आपके मिडलवेयर के बाद उन्हें संभालेंगे । इसलिए प्रत्येक JS या CSS फ़ाइल के लिए, कोड कहा जाएगा।
रॉबर्टक्लेप

1
यह कुकी को 8 बार सेट नहीं करता है, यह कहता है कि कुकी पहले से मौजूद है। जिसकी उम्मीद की जानी है।
रॉबर्टबेलप

14
ध्यान दें कि कुकी पार्सर को अब अलग से स्थापित किया जाना चाहिए। देखें npmjs.com/package/cookie-parser
यहोशू

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('')

})

नमस्ते, क्या आप कह सकते हैं कि क्या हस्ताक्षरित है: सच?
टाइटोइह

यदि आपने कुकी को संकेत के रूप में सेट करने की सलाह दी है, तो यह ध्यान रखना महत्वपूर्ण है कि req.cookie खाली वापस आएगा। आप केवल req.signCookies से हस्ताक्षरित कुकी पुनः प्राप्त कर सकते हैं
कोई विशेष

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'
    })
})

मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।


मैंने ब्राउज़र में अपने पोस्ट अनुरोध का निरीक्षण किया है, लेकिन यह फ़ील्ड पोस्ट अनुरोध के साथ नहीं जा रही है?
सुनील गर्ग

बजाय: एक्सएचआर या jQuery, उपयोग 'सच withCredentials' का उपयोग कर
अनप्लग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.