Как установить cookie в узле JS с помощью Express Framework?

161

В моем приложении мне нужно установить cookie с помощью экспресс-фреймворка. Я пробовал следующий код, но он не устанавливает 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);
Сэчин
источник
Как вы проверяете, что cookie не установлен? Вы проверили заголовки ответов, которые получает браузер?
NilsH
@ NilsH Я добавил запись в журнал. Если он установлен, это означает, что он будет отображаться как «cookie успешно создан» ..
sachin
1
Хорошо, тогда либо ваше промежуточное ПО не вызывается, либо некоторые из предыдущих операторов дают исключение.
NilsH
если я удалил 'app.use (express.static (__dirname +' / public '));' эта строка означает, что она установила cookie
sachin

Ответы:

216

Порядок, в котором вы используете промежуточное программное обеспечение в 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 был установлен.

Обновить

На данный момент парсер cookie представляет собой отдельный пакет npm, поэтому вместо использования

app.use(express.cookieParser());

вам нужно установить его отдельно, npm i cookie-parserа затем использовать как:

const cookieParser = require('cookie-parser');
app.use(cookieParser());
robertklep
источник
также у меня есть еще один вопрос, как я могу проверить, существует ли кокки, прежде чем устанавливать cookie
sachin
Я отредактировал свой ответ, чтобы показать вам, как проверить, установлен ли cookie.
Робертклеп
1
Возможно, на вашей странице есть файлы JS и / или CSS. Те будут обрабатываться express.static, что будет обрабатывать их после вашего промежуточного программного обеспечения. Таким образом, для каждого файла JS или CSS будет вызываться код.
Робертклеп
1
Он не устанавливает cookie 8 раз, он говорит, что cookie уже существует. Что и следовало ожидать.
Робертклеп
14
Обратите внимание, что парсер cookie теперь должен быть установлен отдельно. См. Npmjs.com/package/cookie-parser
Джошуа
118

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

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

Читать куки?

req.cookies

демонстрация

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

})
Уэйн Чиу
источник
привет, не могли бы вы сказать, что подписано: правда?
Титоих
Если вы посоветовали установить cookie в качестве знака, важно отметить, что req.cookie вернется пустым. Вы можете получить только подписанные куки-файлы из req.signedCookies
кто-то
38

Не совсем отвечаю на ваш вопрос, но я наткнулся на ваш вопрос, ища ответ на вопрос, который у меня был. Может быть, это поможет кому-то еще.

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

Ответ сервера вернулся с набором файлов cookie:

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

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

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

Пример:

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

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

зеленый
источник
Я проверил мой запрос на публикацию в браузере, но это поле не соответствует запросу на публикацию?
Сунил
Если вы используете XHR или Jquery, используйте вместо этого «withCredentials: true»
отключено