Jak ustawić plik cookie w Node js za pomocą Express Framework?

161

W mojej aplikacji muszę ustawić plik cookie, korzystając z frameworka ekspresowego. Wypróbowałem następujący kod, ale nie ustawia on pliku cookie.

Czy ktoś może mi w tym pomóc?

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);
sachin
źródło
W jaki sposób sprawdzasz, czy plik cookie nie jest ustawiony? Czy sprawdziłeś nagłówki odpowiedzi, które pobiera przeglądarka?
NilsH
@NilsH Dodałem instrukcję log. Jeśli to ustawione oznacza, że ​​będzie wyświetlane jako „plik cookie utworzył pomyślnie” ..
sachin
1
ok, oznacza to, że oprogramowanie pośredniczące nie jest wywoływane lub niektóre z poprzednich instrukcji zawierają wyjątek.
NilsH
jeśli usunąłem 'app.use (express.static (__ dirname +' / public '));' ta linia oznacza, że ​​ustawiono plik cookie
sachin

Odpowiedzi:

216

Kolejność, w jakiej używasz oprogramowania pośredniego w sprawach Express: oprogramowanie pośrednie zadeklarowane wcześniej zostanie wywołane jako pierwsze, a jeśli może obsłużyć żądanie, żadne oprogramowanie pośrednie zadeklarowane później nie zostanie wywołane.

Jeśli express.staticobsługuje żądanie, musisz przenieść oprogramowanie pośredniczące w górę:

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

Ponadto oprogramowanie pośredniczące musi albo zakończyć żądanie (przez odesłanie odpowiedzi), albo przekazać żądanie do następnego oprogramowania pośredniego. W tym przypadku zrobiłem to drugie, dzwoniąc, next()gdy plik cookie został ustawiony.

Aktualizacja

Obecnie parser plików cookie jest osobnym pakietem npm, więc zamiast używać

app.use(express.cookieParser());

musisz go zainstalować osobno używając, npm i cookie-parsera następnie używać go jako:

const cookieParser = require('cookie-parser');
app.use(cookieParser());
robertklep
źródło
też mam jeszcze jedno pytanie jak mogę sprawdzić czy cokkie istnieje czy nie przed ustawieniem ciasteczka
sachin
Zredagowałem moją odpowiedź, aby pokazać, jak sprawdzić, czy plik cookie jest już ustawiony.
robertklep
1
Prawdopodobnie masz na swojej stronie pliki JS i / lub CSS. Będą one obsługiwane przez oprogramowanie express.static, które będzie obsługiwać je po oprogramowaniu pośredniczącym. Tak więc dla każdego pliku JS lub CSS zostanie wywołany kod.
robertklep
1
Nie ustawia pliku cookie 8 razy, mówi, że plik cookie już istnieje. Czego można się spodziewać.
robertklep
14
Zauważ, że parser plików cookie powinien być teraz zainstalowany osobno. Zobacz npmjs.com/package/cookie-parser
Joshua,
118

Ustawić plik cookie?

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

Przeczytaj Cookie?

req.cookies

Próbny

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

})
Wayne Chiu
źródło
cześć, czy możesz powiedzieć, co jest podpisane: prawda?
titoih
jeśli zaleciłeś ustawienie pliku cookie jako znaku, pamiętaj, że req.cookie zwróci pusty plik. Podpisany plik cookie można pobrać tylko z witryny req.signedCookies
Someone Special
38

Nie do końca odpowiadając na twoje pytanie, ale natknąłem się na twoje pytanie, szukając odpowiedzi na problem, który miałem. Może pomoże to komuś innemu.

Mój problem polegał na tym, że pliki cookie zostały ustawione w odpowiedzi serwera, ale nie zostały zapisane przez przeglądarkę.

Odpowiedź serwera wróciła z ustawionymi plikami cookie:

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

Tak to rozwiązałem.

Użyłem fetchw kodzie po stronie klienta. Jeśli nie zaznaczysz credentials: 'include' w fetchopcjach, pliki cookies nie są wysyłane na serwer ani zapisywane przez przeglądarkę, mimo że odpowiedź serwera ustawia pliki cookies.

Przykład:

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

Mam nadzieję, że to komuś pomoże.

Zielony
źródło
Sprawdziłem moją prośbę o wpis w przeglądarce, ale to pole nie jest wyświetlane?
Sunil Garg
Jeśli używasz XHR lub Jquery, użyj zamiast tego „withCredentials: true”
unplugged