2012-05-18 16 views
12

Używam poniższych ustawień, aby ustawić plik cookie przy użyciu wyrażenia.Node.js i express - jak odczytać plik cookie, ale jest niezdefiniowany.

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

Używam middleware, aby spróbować odczytać cookie:

app.use(express.cookieParser()); 

var cookie_id = req.cookies.test; 

Problem jest to, że cookie_id jest niezdefiniowany whne byłoby 'tak'

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) 

Co zrobiłem źle?

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

można użyć skrzypek/Firebug lub Google Chrome, i sprawdzić, czy plik cookie jest przekazywana do trasy (gdzie sprawdzasz ciasteczko). (Sprawdź nagłówki HTTP żądania HTTP). Aktualizacja - plik cookie jest poprawnie ustawiony i jest przekazywany. Więc tylko to, że środek może nie być w prawidłowy sposób ..... Czy możesz sprawdzić, czy app.use (express.cookieParser()); znajduje się przed linią definiującą app.get (gdzie sprawdzasz ciasteczko)? Czy definiujesz app.use (cookieparser) wewnątrz definicji trasy get? –

+0

Witam, dodałem nagłówki firebugów. – Tampa

+0

Witam ... Dodałem kod, w którym dodaję analizator plików cookie. w sekcji app.configure – Tampa

Odpowiedz

22

Trzeba użyć express.cookieParser()przedapp.router; oprogramowanie pośredniczące jest uruchamiane w celu uzyskania, co oznacza, że ​​przed wykonaniem trasy nigdy nie osiągnie cookieParser().

Spróbuj tego:

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

Uważaj, że 'cookieParser' nie jest teraz dołączany do wyrażania i musisz zainstalować go osobno używając' npm install cookie-parser --save-dev' –

1

ja rozwiązałem dodając app.use(express.cookieParser()); powyżej app.router.

+0

Uważaj, aby 'cookieParser' nie był teraz dołączony do wyrażenia, a ty trzeba zainstalować osobno używając 'npm install cookie-parser --save-dev' –

+0

@FarzadYZ Dlaczego' --save-dev'? Czy nie wystarcza '--save'? – BlueEyesWhiteDragon

+0

@ BlueEyesWhiteDragon Masz rację. Musi być zainstalowany przez '--save', ponieważ jest to obowiązkowe przy produkcji. –

4

Większość oprogramowania pośredniego (np. CookieParser) nie jest już dołączane do Express i musi być instalowane osobno.

Install cookie-parser:

npm install cookie-parser 

Wykorzystanie

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

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

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

Powiązane problemy