2013-04-25 10 views
68

Nella mia applicazione, ho bisogno di impostare un cookie utilizzando il framework espresso. Ho provato il seguente codice ma non sta impostando il cookie.Come impostare i cookie nel nodo js usando il framework espresso?

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

Come stai verificando che il cookie non sia impostato? Hai controllato le intestazioni di risposta che il browser sta ottenendo? – NilsH

+0

@NilsH ho aggiunto la dichiarazione di registro. Se impostato significa che verrà visualizzato come "cookie creato in modo sospetto" .. – sachin

+0

ok, quindi il middleware non viene richiamato o alcune delle istruzioni precedenti forniscono un'eccezione. – NilsH

risposta

116

L'ordine in cui si utilizza il middleware in materia espresso: middleware dichiarato in precedenza verrà chiamato prima, e se è in grado di gestire una richiesta, qualsiasi middleware dichiarato entro e non verrà chiamato.

Se express.static sta gestendo la richiesta, è necessario spostare il middleware fino:

// 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, middleware deve sia terminare una richiesta (con l'invio di nuovo una risposta), o passare la richiesta al prossimo middleware. In questo caso, ho eseguito quest'ultimo chiamando lo next() quando il cookie è stato impostato.

+0

ok grazie per ur post.last 3 ore sto cercando di risolvere questo problema. ora ho trovato la soluzione. – sachin

+0

anche io ho un'altra domanda come posso controllare se il cokkie è esistente o meno prima di impostare il cookie – sachin

+0

Ho modificato la mia risposta per mostrare come controllare se il cookie è già impostato. – robertklep

37

Imposta cookie?

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

Leggi Cookie?

req.cookies 

Demo

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

}) 
11

Non esattamente risposta alla vostra domanda, ma ho trovato alla ricerca di una risposta alla mia la vostra domanda. Quindi lo post qui, forse aiuterà qualcuno.

Il mio problema era che i cookie sono stati impostati nella risposta del server, ma non sono stati 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 

Ma il cookie non è mai stato salvato da un browser.

Ecco come l'ho risolto.

Io uso fetch in un codice lato client. Se non si specifica credentials: 'include' nelle opzioni fetch, i cookie non vengono né inviati al server né salvati da un browser, sebbene 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' 
    }) 
}) 

Speranza che aiuta qualcuno.

+0

Ho ispezionato la mia richiesta di posta nel browser ma questo campo non sta andando con la richiesta di post? –

+0

È anche la mia soluzione! Eccellente! Come l'hai capito? –

Problemi correlati