Pobierz i ustaw pojedynczy plik Cookie z węzłem.serwer HTTP js

Chcę móc ustawić pojedynczy plik cookie i odczytać ten pojedynczy plik cookie przy każdym żądaniu złożonym do instancji serwera nodejs. Czy można to zrobić w kilku linijkach kodu, bez konieczności wyciągania lib strony trzeciej?

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

Po prostu staram się pobrać powyższy kod bezpośrednio z nodejs.org i włożyć do niego ciasteczko.

Author: Andreas Köberle, 2010-08-03

12 answers

Nie ma szybkiego dostępu do funkcji pobierania/ustawiania plików cookie, więc wymyśliłem następujący hack:

var http = require('http');

function parseCookies (request) {
    var list = {},
        rc = request.headers.cookie;

    rc && rc.split(';').forEach(function( cookie ) {
        var parts = cookie.split('=');
        list[parts.shift().trim()] = decodeURI(parts.join('='));
    });

    return list;
}


http.createServer(function (request, response) {

  // To Read a Cookie
  var cookies = parseCookies(request);

  // To Write a Cookie
  response.writeHead(200, {
    'Set-Cookie': 'mycookie=test',
    'Content-Type': 'text/plain'
  });
  response.end('Hello World\n');
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

Spowoduje to zapisanie wszystkich plików cookie w obiekcie cookies i musisz ustawić pliki cookie podczas pisania głowy.

 164
Author: Corey Hart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 21:20:16

Jeśli używasz biblioteki express, tyle węzłów.Programiści js tak robią, jest łatwiejszy sposób. Sprawdź ekspres.strona dokumentacji js, aby uzyskać więcej informacji.

Powyższy przykład parsowania działa, ale express daje Ci ładną funkcję, aby się tym zająć:

app.use(express.cookieParser());

Aby ustawić plik cookie:

res.cookie('cookiename', 'cookievalue', { maxAge: 900000, httpOnly: true });

Aby wyczyścić plik cookie:

res.clearCookie('cookiename');
 116
Author: RevNoah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 16:46:19

RevNoah miał najlepszą odpowiedź z sugestią użycia parsera cookie Express . Ale ta odpowiedź ma teraz 3 lata i jest nieaktualna.

Używając Express , możesz odczytać plik cookie w następujący sposób

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.get('/myapi', function(req, resp) {
   console.log(req.cookies['Your-Cookie-Name-Here']);
} 

I zaktualizuj swoje package.json z następującymi, zastępując odpowiednie stosunkowo najnowsze wersje.

"dependencies": {
    "express": "4.12.3",
    "cookie-parser": "1.4.0"
  },

Więcej operacji, takich jak ustawianie i analizowanie plików cookie, jest opisanych tutaj

 24
Author: Kirby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 14:40:51

Możesz korzystać z modułu "cookies" npm, który ma kompleksowy zestaw funkcji.

Dokumentacja i przykłady na:
https://github.com/jed/cookies

 10
Author: zah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-08 10:27:49

Pliki cookie są przesyłane przez HTTP-Headers
Będziesz musiał tylko przeanalizować nagłówki żądań i umieścić nagłówki odpowiedzi.

 7
Author: Tobias P.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 13:29:57

Aby uruchomić rozdzielacz plików cookie z plikami cookie, które mają " = "w wartościach plików cookie:

var get_cookies = function(request) {
  var cookies = {};
  request.headers && request.headers.cookie.split(';').forEach(function(cookie) {
    var parts = cookie.match(/(.*?)=(.*)$/)
    cookies[ parts[1].trim() ] = (parts[2] || '').trim();
  });
  return cookies;
};

Następnie, aby uzyskać indywidualny plik cookie:

get_cookies(request)['my_cookie']
 4
Author: David Beckwith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 05:45:27

Jako uzupełnienie odpowiedzi @ Corey Hart, przepisałem parseCookies() używając:

Oto przykład roboczy:

var http = require('http');

function parseCookies(cookie) {
    return cookie.split(';').reduce(
        function(prev, curr) {
            var m = / *([^=]+)=(.*)/.exec(curr);
            var key = m[1];
            var value = decodeURIComponent(m[2]);
            prev[key] = value;
            return prev;
        },
        { }
    );
}

function stringifyCookies(cookies) {
    var list = [ ];
    for (var key in cookies) {
        list.push(key + '=' + encodeURIComponent(cookies[key]));
    }
    return list.join('; ');
}

http.createServer(function (request, response) {
  var cookies = parseCookies(request.headers.cookie);
  console.log('Input cookies: ', cookies);
  cookies.search = 'google';
  if (cookies.counter)
    cookies.counter++;
  else
    cookies.counter = 1;
  console.log('Output cookies: ', cookies);
  response.writeHead(200, {
    'Set-Cookie': stringifyCookies(cookies),
    'Content-Type': 'text/plain'
  });
  response.end('Hello World\n');
}).listen(1234);

Zauważam również, że OP używa modułu http. Jeśli OP używałrestify , może użyć of restify-cookies :

var CookieParser = require('restify-cookies');
var Restify = require('restify');
var server = Restify.createServer();
server.use(CookieParser.parse);
server.get('/', function(req, res, next){
  var cookies = req.cookies; // Gets read-only cookies from the request
  res.setCookie('my-new-cookie', 'Hi There'); // Adds a new cookie to the response
  res.send(JSON.stringify(cookies));
});
server.listen(8080);
 3
Author: Stephen Quan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-27 06:07:32

Oto zgrabna łatka copy-n-paste do zarządzania plikami cookie w węźle. Zrobię to w CoffeeScript, dla piękna.

http = require 'http'

http.IncomingMessage::getCookie = (name) ->
  cookies = {}
  this.headers.cookie && this.headers.cookie.split(';').forEach (cookie) ->
    parts = cookie.split '='
    cookies[parts[0].trim()] = (parts[1] || '').trim()
    return

  return cookies[name] || null

http.IncomingMessage::getCookies = ->
  cookies = {}
  this.headers.cookie && this.headers.cookie.split(';').forEach (cookie) ->
    parts = cookie.split '='
    cookies[parts[0].trim()] = (parts[1] || '').trim()
    return

  return cookies

http.OutgoingMessage::setCookie = (name, value, exdays, domain, path) ->
  cookies = this.getHeader 'Set-Cookie'
  if typeof cookies isnt 'object'
    cookies = []

  exdate = new Date()
  exdate.setDate(exdate.getDate() + exdays);
  cookieText = name+'='+value+';expires='+exdate.toUTCString()+';'
  if domain
    cookieText += 'domain='+domain+';'
  if path
    cookieText += 'path='+path+';'

  cookies.push cookieText
  this.setHeader 'Set-Cookie', cookies
  return

Teraz będziesz mógł obsługiwać ciasteczka tak, jak byś się spodziewał:

server = http.createServer (request, response) ->
  #get individually
  cookieValue = request.getCookie 'testCookie'
  console.log 'testCookie\'s value is '+cookieValue

  #get altogether
  allCookies = request.getCookies()
  console.log allCookies

  #set
  response.setCookie 'newCookie', 'cookieValue', 30

  response.end 'I luvs da cookies';
  return

server.listen 8080
 2
Author: Philip Orange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-27 23:12:53

Jeśli nie obchodzi cię, co jest w cookie i po prostu chcesz go użyć, spróbuj tego czystego podejścia za pomocą request (popularny moduł węzła):

var request = require('request');
var j = request.jar();
var request = request.defaults({jar:j});
request('http://www.google.com', function () {
  request('http://images.google.com', function (error, response, body){
     // this request will will have the cookie which first request received
     // do stuff
  });
});
 0
Author: BlackBeard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 11:36:04

Inny prosty sposób JavaScript, aby uzyskać wartość cookie za pomocą klucza bez użycia regex:

function getCookieValue(k) {
    var str = document.cookie; // 'k1=v1=v11=v12; k2=v2; k3=v3'
    var i = str.indexOf(k + '=');
    if (i === -1) {
        return undefined;
    }
    if (i > 0 && str[i - 1] !== ' ') {
        return undefined;
    }
    var j = i + k.length + 1;
    var end = str.indexOf(';', j);
    return decodeURIComponent(str.slice(j, end === -1 ? undefined : end));
}
 0
Author: Sento,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 07:01:06

Aby uzyskać pojedyncze ciasteczko ten kod byłby szybszy niż parsowanie wszystkich ciasteczek:

getSingleCookie = (cookie, name) ->
  vIx = cookie.indexOf "#{name}="
  if vIx != -1
    egalIx = vIx+name.length+1
    colIx = cookie.indexOf ';', egalIx
    v = if colIx == -1
      cookie.substring egalIx
    else
      cookie.substring egalIx, colIx
    return v

Należy używać w następujący sposób:

getSingleCookie request.headers, 'my_cookie'
 -1
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-01 11:30:19

Najpierw należy utworzyć plik cookie (jako przykład zawinąłem token w pliku cookie), a następnie ustawić go w response.To użyj pliku cookie w następujący sposób zainstaluj cookieParser

app.use(cookieParser());

Przeglądarka zapisze go w zakładce "zasoby" i będzie używana do każdego żądania, przyjmując początkowy adres URL jako podstawę

var token = student.generateToken('authentication');
        res.cookie('token', token, {
            expires: new Date(Date.now() + 9999999),
            httpOnly: false
        }).status(200).send();

Uzyskanie pliku cookie z żądania po stronie serwera jest również łatwe.Musisz wyodrębnić plik cookie z żądania, dzwoniąc do właściwości "cookie" żądania obiekt.

var token = req.cookies.token; // Retrieving Token stored in cookies
 -1
Author: Ankit kaushik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 18:39:56