Як встановити cookie у вузлі js за допомогою Express Framework?


161

У моїй програмі мені потрібно встановити файл cookie за допомогою Express Framework. Я спробував наступний код, але файл 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());

Також у мене є ще одне питання, як я можу перевірити, чи існує файли cookie, перш ніж встановлювати файли cookie
sachin

Я відредагував свою відповідь, щоб показати вам, як перевірити, чи cookie вже встановлено.
robertklep

1
Напевно, на вашій сторінці є деякі файли JS та / або CSS. Тими, хто буде оброблятися express.static, буде обробляти їх після вашого проміжного програмного забезпечення. Отже для кожного файлу JS або CSS код буде називатися.
robertklep

1
Він не встановлює файл cookie 8 разів, він говорить, що файл cookie вже існує. Чого варто очікувати.
robertklep

14
Зауважте, що тепер аналізатор файлів cookie має бути встановлений окремо. Дивіться npmjs.com/package/cookie-parser
Джошуа

118

Встановити Cookie?

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

Читати Cookie?

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

})

привіт, ви могли б сказати, що підписано: правда?
titoih

якщо ви порадили встановити cookie як знак, важливо зазначити, що req.cookie повернеться порожнім. Ви можете отримати підписаний файл cookie лише з req.signedCookies
Хтось Спеціальний

38

Не точно відповідаючи на ваше запитання, але я натрапив на ваше запитання, шукаючи відповідь на питання, яке у мене виникло. Можливо, це допоможе комусь іншому.

Моя проблема полягала в тому, що куки були встановлені у відповіді сервера, але браузер не зберігав їх.

Відповідь сервера повернулася із встановленими файлами cookie:

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

Ось як я це вирішив.

Я використовував fetchу коді клієнта. Якщо ви не вказуєте credentials: 'include' в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'
    })
})

Я сподіваюся, що це комусь допоможе.


Я перевірив свій запит на пошту в браузері, але це поле не відповідає запиту на пошту?
Суніл Гарг

Якщо ви використовуєте XHR або Jquery, використовуйте замість "withCredentials: true"
відключено

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.