Express framework kullanarak js düğümünde çerez nasıl ayarlanır?


161

Uygulamamda, ekspres çerçeveyi kullanarak bir çerez ayarlamalıyım.Aşağıdaki kodu denedim ama çerez ayarlamıyor.

Birisi bunu yapmama yardım edebilir mi?

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);

Çerezin ayarlanmadığını nasıl doğrularsınız? Tarayıcının aldığı yanıt başlıklarını kontrol ettiniz mi?
NilsH

@NilsH günlük deyimi ekledim. Ayarlanmışsa, "çerez suspcessfully oluşturdu" olarak görüntüleneceği anlamına gelir ..
sachin

1
Tamam, ara katman yazılımınız çağrılmaz veya önceki ifadelerden bazıları bir istisna oluşturur.
NilsH

'app.use (express.static (__ dirname +' / public '));' bu satır çerez ayarlandığı anlamına gelir
sachin

Yanıtlar:


216

Express'te ara katman yazılımı kullanma sırası: daha önce bildirilen ara katman yazılımı ilk olarak çağrılır ve bir isteği işleyebiliyorsa, daha sonra bildirilen herhangi bir ara katman yazılımı çağrılmaz.

Eğer express.staticisteği işleyen, kendi ara katman yukarı taşımak gerekir:

// 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'));

Ayrıca için katman ihtiyaçları ya ucunda (bir yanıt geri göndererek) bir talep ya da bir sonraki katman isteği geçmektedir. Bu durumda, ikincisini next()çerez ayarlandığında arayarak yaptım .

Güncelleme

Şu an itibariyle, çerez ayrıştırıcısı ayrı bir npm paketidir, bu yüzden kullanmak yerine

app.use(express.cookieParser());

aşağıdakileri kullanarak ayrı olarak yüklemeniz npm i cookie-parserve ardından şu şekilde kullanmanız gerekir:

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

Ayrıca nasıl bir cokkie çerez ayarlamadan önce cokkie var olup olmadığını kontrol edebilirsiniz
sachin

Cevabın önceden ayarlanmış olup olmadığını nasıl kontrol edeceğinizi göstermek için cevabımı düzenledim.
robertklep

1
Sayfanızda muhtemelen bazı JS ve / veya CSS dosyalarınız var. Bunlar tarafından ele alınacak express.static, bu da ara katman yazılımınızdan sonra ele alınacaktır . Böylece her JS veya CSS dosyası için kod çağrılır.
robertklep

1
Çerezi 8 kez ayarlamadı, çerez zaten var diyor. Bu beklenen bir şey.
robertklep

14
Çerez ayrıştırıcısının artık ayrı olarak yüklenmesi gerektiğini unutmayın. Bkz. Npmjs.com/package/cookie-parser
Joshua

118

Çerez Ayarlansın mı?

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

Çerez Oku mu?

req.cookies

gösteri

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

})

merhaba, ne imzaladığını söyleyebilir misin: doğru mu?
titoih

çerezi işaret olarak ayarlamanızı tavsiye ettiyseniz, req.cookie'nin boş döneceğini unutmayın. Yalnızca req.signedCookies gelen imzalı çerez alabilirsiniz
Birisi Özel

38

Sorunuzu tam olarak yanıtlamıyor, ancak yaşadığım bir sorunun cevabını ararken sorunuza rastladım. Belki başka birine yardım eder.

Benim sorunum çerezleri sunucu yanıtında ayarlanmış, ancak tarayıcı tarafından kaydedilmemişti.

Sunucu yanıtı çerez seti ile geri döndü:

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

Ben böyle çözdüm.

Kullandığım fetchistemci tarafı kodu. Eğer belirtmezseniz credentials: 'include' içinde fetchseçenekler, kurabiye ne sunucuya gönderilir, ne de kaydedilen tarayıcı tarafından, hatta sunucu yanıt setleri kurabiye olsa edilir.

Misal:

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

Umarım bu birine yardımcı olur.


Gönderim isteğimi tarayıcıda inceledim ancak bu alan gönderim isteğiyle gitmiyor mu?
Sunil Garg

XHR veya Jquery kullanıyorsanız bunun yerine 'withCredentials: true' kullanın
fişten çekilmiş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.