Come impostare i cookie nel nodo js utilizzando Express Framework?


161

Nella mia applicazione, devo impostare un cookie utilizzando il framework espresso. Ho provato il codice seguente ma non sta impostando il cookie.

Qualcuno può aiutarmi a fare questo?

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

Come stai verificando che il cookie non sia impostato? Hai controllato le intestazioni di risposta ottenute dal browser?
NilsH,

@NilsH ho aggiunto registro statement.if ha fissato i mezzi esso apparirà come 'cookie hanno creato susccessfully' ..
Sachin

1
ok, allora il tuo middleware non viene invocato o alcune delle precedenti dichiarazioni danno un'eccezione.
NilsH,

se ho rimosso 'app.use (express.static (__ dirname +' / public '));' questa riga indica che è impostato il cookie
bustina il

Risposte:


216

L'ordine in cui si utilizza il middleware in Express è importante: il middleware dichiarato in precedenza verrà chiamato per primo e, se è in grado di gestire una richiesta, qualsiasi middleware dichiarato in seguito non verrà richiamato.

Se express.staticsta gestendo la richiesta, è necessario spostare il middleware verso l'alto:

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

Inoltre, le esigenze middleware o fine di una richiesta (con l'invio di una risposta indietro), o passare la richiesta al prossimo middleware. In questo caso, ho fatto quest'ultimo chiamando next()quando è stato impostato il cookie.

Aggiornare

A partire da ora il cookie parser è un pacchetto npm separato, quindi invece di utilizzare

app.use(express.cookieParser());

è necessario installarlo separatamente utilizzando npm i cookie-parsere quindi utilizzarlo come:

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

anche io ho un'altra domanda su come posso verificare se il cokkie esiste o no prima di impostare il cookie
bustina

Ho modificato la mia risposta per mostrarti come verificare se il cookie è già impostato.
robertklep,

1
Probabilmente hai alcuni file JS e / o CSS sulla tua pagina. Questi saranno gestiti da express.static, che li gestirà dopo il tuo middleware. Quindi, per ogni file JS o CSS, verrà chiamato il codice.
robertklep,

1
Non imposta il cookie 8 volte, dice che il cookie esiste già. Che è prevedibile.
robertklep,

14
Si noti che il parser dei cookie ora dovrebbe essere installato separatamente. Vedi npmjs.com/package/cookie-parser
Joshua il

118

Imposta cookie?

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

Leggi i cookie?

req.cookies

dimostrazione

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

})

ciao, potresti dire cosa è firmato: vero?
martedì

se hai consigliato di impostare il cookie come segno, è importante notare che req.cookie tornerà vuoto. Puoi recuperare i cookie firmati solo da req.signedCookies
Someone Special

38

Non ho risposto esattamente alla tua domanda, ma mi sono imbattuto nella tua domanda, mentre cercavo una risposta a un problema che avevo. Forse aiuterà qualcun altro.

Il mio problema era che i cookie erano impostati nella risposta del server, ma non venivano salvati dal browser.

La risposta del server è tornata con i cookie impostati:

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

Ecco come l'ho risolto.

Ho usato fetchnel codice lato client. Se non si specifica credentials: 'include' nelle fetchopzioni, i cookie non vengono né inviati al server né salvati dal browser, anche se la risposta del server imposta i cookie.

Esempio:

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

Spero che questo aiuti qualcuno.


Ho controllato la mia richiesta di post nel browser ma questo campo non sta andando con la richiesta di post?
Sunil Garg,

Se si utilizza XHR o Jquery, utilizzare invece "withCredentials: true"
scollegato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.