Как установить cookie в node js с помощью экспресс-рамки?

В моем приложении мне нужно установить куки файл, используя экспресс-фреймворк. Я пробовал следующий код, но не устанавливал cookie.

Может ли кто-нибудь помочь мне сделать это?

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

Ответ 1

Порядок, в котором вы используете промежуточное программное обеспечение в Express: сначала будет вызвано промежуточное ПО, объявленное ранее, и если он сможет обрабатывать запрос, любое промежуточное ПО, объявленное позже, не будет вызвано.

Если express.static обрабатывает запрос, вам нужно переместить ваше промежуточное ПО:

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

Кроме того, промежуточное программное обеспечение должно либо завершить запрос (путем отправки ответа), либо передать запрос следующему промежуточному программному обеспечению. В этом случае я сделал последний, вызвав next(), когда cookie был установлен.

Ответ 2

Установить Cookie?

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

Чтение 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('')

})

Ответ 3

Не совсем ответьте на вопрос, но я нашел ваш вопрос в поиске ответа на мою проблему. Поэтому я публикую его здесь, возможно, это поможет кому-то.

Моя проблема заключалась в том, что файлы cookie были установлены в ответе сервера, но не были сохранены браузером. Ответ сервера вернулся с установленными cookie:

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

Но cookie никогда не сохранялся в браузере.

Вот как я это решил.

Я использую fetch в клиентском коде. Если вы не укажете опцию credentials: 'include' in fetch, файлы cookie не отправляются на сервер и не сохраняются браузером, хотя ответ сервера устанавливает файлы cookie.

Пример:

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

Надеюсь, это поможет кому-то.