web-dev-qa-db-fra.com

Obtenir et définir un seul cookie avec le serveur HTTP Node.js

Je veux pouvoir configurer un seul cookie et lire ce cookie à chaque demande adressée à l'instance du serveur nodejs. Cela peut-il être fait en quelques lignes de code, sans qu'il soit nécessaire d'extraire une bibliothèque tierce?

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

J'essaie juste de prendre le code ci-dessus directement à partir de nodejs.org et d'y insérer un cookie.

147
Corey Hart

Il n’existe pas de fonction permettant d’obtenir/d’installer des cookies, alors j’ai eu le hack suivant:

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

Cela va stocker tous les cookies dans l'objet de cookies, et vous devez définir des cookies lorsque vous écrivez la tête.

180
Corey Hart

Si vous utilisez la bibliothèque express, comme le font beaucoup de développeurs node.js, il existe un moyen plus simple. Consultez la page de documentation de Express.js pour plus d'informations.

L'exemple d'analyse ci-dessus fonctionne, mais express vous donne une fonction agréable à prendre en charge:

app.use(express.cookieParser());

Pour définir un cookie:

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

Pour effacer le cookie:

res.clearCookie('cookiename');
118
RevNoah

RevNoah avait la meilleure réponse avec la suggestion d'utiliser Express analyseur de cookie . Mais cette réponse a maintenant 3 ans et est périmée.

En utilisant Express , vous pouvez lire un cookie comme suit

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

Et mettez à jour votre package.json avec ce qui suit en remplaçant les versions les plus récentes appropriées.

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

Plus d'opérations telles que la configuration et l'analyse des cookies sont décrites ici et ici

27
Kirby

Vous pouvez utiliser le module "cookies" npm, qui propose un ensemble complet de fonctionnalités.

Documentation et exemples sur:
https://github.com/jed/cookies

10
zah

Pour améliorer la réponse de @Corey Hart, j'ai réécrit le parseCookies() en utilisant:

Voici l'exemple de travail:

let http = require('http');

function parseCookies(cookie) {
  let rx = /([^;=\s]*)=([^;]*)/g;
  let obj = { };
  for ( let m ; m = rx.exec(cookie) ; )
    obj[ m[1] ] = decodeURIComponent( m[2] );
  return obj;
}

function stringifyCookies(cookies) {
  let list = [ ];
  for ( [ key, value ] of Object.entries( cookies ) )
    list.Push( key + '=' + encodeURIComponent( value ) );
  return list.join( '; ' );
}

http.createServer(function ( request, response ) {
  let 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);

Je note également que l'OP utilise le module http. Si l'OP utilisait restify , il peut utiliser 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);
7
Stephen Quan

Pour qu'un séparateur de cookies fonctionne avec des cookies contenant '=' dans les valeurs de 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;
};

alors pour obtenir un cookie individuel:

get_cookies(request)['my_cookie']
6
David Beckwith

Les cookies sont transférés via HTTP-Headers
Il vous suffira d'analyser les en-têtes de requête et de placer les en-têtes de réponse.

6
Tobias P.

Voici un correctif copier-coller pour gérer les cookies dans les nœuds. Je vais le faire dans CoffeeScript, pour la beauté.

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

Vous pourrez maintenant gérer les cookies comme vous le souhaitiez:

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
Philip Orange

Si vous ne vous souciez pas de ce qu'il y a dans cookie et que vous voulez juste l'utiliser, essayez cette approche simple en utilisant request (un module de noeud populaire):

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
  });
});
1
BlackBeard