Como definir o cookie no nó js usando o framework expresso?

161

No meu aplicativo, preciso definir um cookie usando a estrutura expressa. Tentei o código a seguir, mas ele não está definindo o cookie.

Alguém pode me ajudar a fazer isso?

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
fonte
Como você está verificando se o cookie não está definido? Você verificou os cabeçalhos de resposta que o navegador está recebendo?
NilsH
@NilsH eu adicionei log statement.if que definir meios que irá mostrar como 'cookies criaram susccessfully' ..
sachin
1
ok, seu middleware não é chamado ou algumas das instruções anteriores dão uma exceção.
N / A
se eu removi 'app.use (express.static (__ dirname +' / public '));' este meio de linha é definir o cookie
sachin

Respostas:

216

A ordem na qual você usa o middleware no Express é importante: o middleware declarado anteriormente será chamado primeiro e, se puder lidar com uma solicitação, qualquer middleware declarado posteriormente não será chamado.

Se express.staticestiver lidando com a solicitação, você precisará mover seu middleware para cima:

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

Além disso, as necessidades de middleware para qualquer fim um pedido (enviando de volta uma resposta), ou passar a solicitação para a próxima middleware. Nesse caso, eu fiz o último chamando next()quando o cookie foi definido.

Atualizar

A partir de agora o analisador de cookies é um pacote npm separado, portanto, em vez de usar

app.use(express.cookieParser());

você precisa instalá-lo separadamente usando npm i cookie-parsere depois usá-lo como:

const cookieParser = require('cookie-parser');
app.use(cookieParser());
robertklep
fonte
Também eu tenho mais uma pergunta como posso verificar se o cokkie é existente ou não antes de definir o cookie
sachin
Editei minha resposta para mostrar como verificar se o cookie já está definido.
precisa saber é o seguinte
1
Você provavelmente tem alguns arquivos JS e / ou CSS em sua página. Esses serão tratados por eles express.static, que os tratarão após o seu middleware. Portanto, para cada arquivo JS ou CSS, o código será chamado.
precisa saber é o seguinte
1
Ele não define o cookie 8 vezes, diz que o cookie já existe. O que é de se esperar.
Robertklep
13
Observe que o analisador de cookies agora deve ser instalado separadamente. Veja npmjs.com/package/cookie-parser
Joshua
117

Definir cookie?

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

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

})
Wayne Chiu
fonte
oi, você poderia dizer o que está assinado: verdadeiro?
titoih 11/04
se você recomendou definir o cookie como sinal, é importante observar que o req.cookie retornará vazio. Você só pode recuperar o cookie assinado de req.signedCookies
Someone Special
38

Não estou respondendo exatamente à sua pergunta, mas me deparei com ela, enquanto procurava uma resposta para um problema que eu tinha. Talvez isso ajude outra pessoa.

Meu problema foi que os cookies foram definidos na resposta do servidor, mas não foram salvos pelo navegador.

A resposta do servidor voltou com os cookies configurados:

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

Foi assim que eu resolvi.

Eu usei fetchno código do lado do cliente. Se você não especificar credentials: 'include' nofetch opções, os cookies não serão enviados ao servidor nem salvos pelo navegador, mesmo que a resposta do servidor defina cookies.

Exemplo:

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 isso ajude alguém.

Verde
fonte
Inspecionei minha solicitação de postagem no navegador, mas esse campo não está de acordo com a solicitação de postagem?
Sunil Garg
Se estiver usando XHR ou Jquery, use 'withCredentials: true'
desconectado