2012-05-18 6 views
12

Io uso il sotto per impostare un cookie utilizzando express.Node.js ed express - come leggere un cookie ma non è definito

res.cookie('test', 'yes', { 
    expires: new Date(Date.now() + 365*2*24*60*60*1000), 
    httpOnly: true 
}); 

Sto usando il middleware per cercare di leggere il cookie:

app.use(express.cookieParser()); 

var cookie_id = req.cookies.test; 

Il problema è che cookie_id è indefinito whne sarebbe 'sì'

Express server listening on port 8060 in development mode 
TypeError: Cannot read property 'test' of undefined 
    at /home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/app.js:48:29 
    at callbacks (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/lib/router/index.js:272:11) 
    at param (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/lib/router/index.js:246:11) 
    at pass (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/lib/router/index.js:253:5) 
    at Router._dispatch (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/lib/router/index.js:280:4) 
    at Object.handle (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/lib/router/index.js:45:10) 
    at next (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/node_modules/connect/lib/http.js:204:15) 
    at Object.methodOverride [as handle] (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:35:5) 
    at next (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/node_modules/connect/lib/http.js:204:15) 
    at Object.bodyParser [as handle] (/home/ubuntu/workspace/rtbopsConfig/rtbServers/rtbNodejsServer/nodeServer/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js:88:61) 

cosa ho fatto sbagliato?

Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Encoding gzip, deflate 
Accept-Language en-us,en;q=0.5 
Connection keep-alive 
Cookie test=yes 
Host 127.0.0.1:8060 
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0 
// Configuration 
app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
    app.use(express.cookieParser()); 
}); 
+0

si può utilizzare Fiddler/Firebug o Google Chrome, e vedere se viene passato il cookie al percorso (dove stai controllando il cookie). (Chekc le intestazioni HTTP della richiesta HTTP). Aggiornamento: il cookie viene impostato correttamente e viene passato. Quindi è solo che il middleware potrebbe non essere nel modo corretto ..... Puoi controllare se l'app.use (express.cookieParser()); è prima della linea che definisce l'app.get (dove stai controllando il cookie)? Stai definendo l'app.use (cookieparser) all'interno della definizione del percorso di acquisizione? –

+0

Ciao, ho aggiunto le intestazioni di Firebug. – Tampa

+0

Ciao ... Ho aggiunto il codice dove aggiungo il parser dei cookie. nella sezione app.configure – Tampa

risposta

22

è necessario utilizzare express.cookieParser()primaapp.router; il middleware è eseguito nell'ordine, il che significa che non raggiunge mai il valore cookieParser() prima che il percorso venga eseguito.

Prova questo:

app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
+0

Fai attenzione che 'cookieParser' non sia ora in bundle per esprimere ed è necessario installarlo separatamente usando' npm install cookie-parser --save-dev' –

1

ho risolto con l'aggiunta di app.use(express.cookieParser()); sopra il app.router.

+0

Fai attenzione che 'cookieParser' non sia ora in bundle per esprimere e tu è necessario installarlo separatamente usando 'npm install cookie-parser --save-dev' –

+0

@FarzadYZ Perché' --save-dev'? Non è '--save' abbastanza? – BlueEyesWhiteDragon

+0

@BlueEyesWhiteDragon Hai ragione. Deve essere installato da '--save' perché è obbligatorio in produzione. –

4

La maggior parte del middleware (come cookieParser) non è più in bundle con Express e deve essere installato separatamente.

Installare cookie-parser:

npm install cookie-parser 

Uso

var express  = require('express') 
var cookieParser = require('cookie-parser') 

var app = express() 
app.use(cookieParser()) 

https://github.com/expressjs/cookie-parser