2013-04-25 10 views
68

W mojej aplikacji potrzebuję ustawić plik cookie przy użyciu frameworku express. Próbowałem użyć następującego kodu, ale nie ustawiłem pliku cookie.Jak ustawić plik cookie w węźle js za pomocą ramek ekspresowych?

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

W jaki sposób sprawdzasz, że plik cookie nie jest ustawiony? Czy sprawdziłeś nagłówki odpowiedzi w przeglądarce? – NilsH

+0

@NilsH Dodałem instrukcję logu. Jeśli ją ustawisz, będzie ona wyświetlana jako "ciasteczko utworzone przez pomyłkę" .. – sachin

+0

ok, to albo nie zostanie uruchomione oprogramowanie pośrednie, albo niektóre z poprzednich instrukcji dają wyjątek. – NilsH

Odpowiedz

116

Kolejność, w jakiej używasz middleware w sprawach Express: middleware zadeklarowane wcześniej dostanie zwany pierwszy, i czy może on obsługiwać żądania, wszelkie middleware oświadczył później nie zostanie wywołana.

Jeśli express.static jest obsługa żądania, trzeba przenieść middleware się:

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

Również middleware musi albo zakończyć żądanie (poprzez wysłanie z powrotem odpowiedzi) lub przekazać wniosek do następnego oprogramowania pośredniego. W tym przypadku zrobiłem to drugie wywołując next(), gdy plik cookie został ustawiony.

+0

ok, dziękuję za ur. post.last 3 godziny, próbuję rozwiązać this.now i znalazłem rozwiązanie. – sachin

+0

Mam jeszcze jedno pytanie, jak mogę sprawdzić, czy cokkie istnieje, czy nie, zanim ustawiam ciasteczko. – sachin

+0

Edytowałem swoją odpowiedź, aby pokazać, jak sprawdzić, czy plik cookie jest już ustawiony. – robertklep

37

Ustaw plik cookie?

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

Czytaj 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

Niezupełnie odpowiedzieć na Twoje pytanie, ale znalazłem swoje pytanie szuka odpowiedzi na mój problem. Więc zamieszczam to tutaj, może to pomoże komuś.

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 powróciła z ustawieniami plików cookie:

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

Ale plik cookie nigdy nie został zapisany przez przeglądarkę.

Tak to rozwiązałem.

Używam fetch w kodzie strony klienta. Jeśli nie podasz opcji credentials: 'include' w opcjach fetch, pliki cookie nie są wysyłane na serwer ani zapisywane przez przeglądarkę, chociaż odpowiedź serwera ustawia pliki cookie.

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

Nadzieja pomaga kogoś.

+0

Sprawdziłem moją prośbę o wpis w przeglądarce, ale to pole nie pasuje do żądania postu? –

+0

To także moje rozwiązanie! Doskonały! Jak się zorientowałeś? –

Powiązane problemy