¿Cómo configurar la cookie en el nodo js usando express framework?

161

En mi aplicación, necesito configurar una cookie usando el framework express. He probado el siguiente código pero no está configurando la cookie.

¿Alguien puede ayudarme a hacer esto?

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);
sachin
fuente
¿Cómo está verificando que la cookie no está configurada? ¿Ha verificado los encabezados de respuesta que recibe el navegador?
NilsH
@NilsH he añadido statement.if registro que establece medios, se mostrará como 'cookie han creado susccessfully' ..
sachin
1
ok, entonces su middleware no se invoca, o algunas de las declaraciones anteriores dan una excepción.
NilsH
si eliminé 'app.use (express.static (__ dirname +' / public '));' esta línea significa que está configurada la cookie
sachin

Respuestas:

216

El orden en el que usa el middleware en Express es importante: el middleware declarado anteriormente se llamará primero, y si puede manejar una solicitud, cualquier middleware declarado más tarde no se llamará.

Si express.staticestá manejando la solicitud, debe mover su middleware hacia arriba:

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

Además, las necesidades de middleware a cualquiera extremo una petición (mediante el envío de una respuesta de vuelta), o pasar la solicitud a la siguiente middleware. En este caso, he hecho esto último llamando next()cuando se ha configurado la cookie.

Actualizar

A partir de ahora, el analizador de cookies es un paquete npm separado, por lo que en lugar de usar

app.use(express.cookieParser());

necesita instalarlo por separado usando npm i cookie-parsery luego usarlo como:

const cookieParser = require('cookie-parser');
app.use(cookieParser());
robertklep
fuente
También tengo una pregunta más ¿Cómo puedo comprobar si el cokkie está vigente o no antes de la cookie
sachin
Edité mi respuesta para mostrarle cómo verificar si la cookie ya está configurada.
robertklep
1
Probablemente tenga algunos archivos JS y / o CSS en su página. Esos serán manejados por express.static, que los manejará después de su middleware. Entonces, para cada archivo JS o CSS, se llamará al código.
robertklep
1
No establece la cookie 8 veces, dice que la cookie ya existe. Lo cual es de esperar.
robertklep
14
Tenga en cuenta que el analizador de cookies ahora debe instalarse por separado. Ver npmjs.com/package/cookie-parser
Joshua el
118

Establecer cookie?

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

Leer cookie?

req.cookies

Manifestación

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

})
Wayne Chiu
fuente
hola, ¿podrías decir lo que está firmado: cierto?
Titoih
Si ha recomendado configurar la cookie como signo, es importante tener en cuenta que req.cookie volverá vacío. Solo puede recuperar la cookie firmada de req.signedCookies
Someone Special
38

No respondí exactamente su pregunta, pero me encontré con su pregunta, mientras buscaba una respuesta a un problema que tenía. Quizás ayude a alguien más.

Mi problema fue que las cookies se configuraron en la respuesta del servidor, pero el navegador no las guardó.

La respuesta del servidor regresó con el conjunto de cookies:

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

Así es como lo resolví.

Solía fetchen el código del lado del cliente. Si no especifica credentials: 'include' en las fetchopciones, las cookies no se envían al servidor ni se guardan en el navegador, a pesar de que la respuesta del servidor las establece.

Ejemplo:

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

Espero que esto ayude a alguien.

Verde
fuente
¿He inspeccionado mi solicitud de publicación en el navegador pero este campo no coincide con la solicitud de publicación?
Sunil Garg el
Si usa XHR o Jquery, use 'withCredentials: true' en su lugar
desconectado