186 votes

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

Je souhaite pouvoir définir un cookie unique, et lire ce cookie unique à chaque requête faite à l'instance de serveur nodejs. Cela peut être fait en quelques lignes de code, sans avoir besoin de faire appel à une librairie 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 intégrer un cookie.

228voto

Corey Hart Points 3238

Il n'existe pas de fonction d'accès rapide pour obtenir ou définir des cookies, j'ai donc trouvé la solution suivante :

const http = require('http');

function parseCookies (request) {
    const list = {};
    const cookieHeader = request.headers?.cookie;
    if (!cookieHeader) return list;

    cookieHeader.split(`;`).forEach(function(cookie) {
        let [ name, ...rest] = cookie.split(`=`);
        name = name?.trim();
        if (!name) return;
        const value = rest.join(`=`).trim();
        if (!value) return;
        list[name] = decodeURIComponent(value);
    });

    return list;
}

const server = http.createServer(function (request, response) {
    // To Read a Cookie
    const 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);

const {address, port} = server.address();
console.log(`Server running at http://${address}:${port}`);

Cela stockera tous les cookies dans l'objet cookies, et vous devrez définir les cookies lorsque vous écrirez l'en-tête.

11 votes

Le code ci-dessus ne fonctionnera pas correctement si la valeur d'un cookie contient une valeur égale ( = ) comme dans l'un des cookies de Facebook tels que fbm_1234123412341234=base_domain=.domain.com .

3 votes

Les valeurs des cookies ne doivent-elles pas être codées en URL / en pourcentage ? = dans la valeur du cookie serait invalide dans ce cas, n'est-ce pas ?

2 votes

Dans ce cas, il est divisé par ; puis par la première instance de = . La gauche est la clé, la droite est la valeur.

130voto

RevNoah Points 711

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

L'exemple de parsing ci-dessus fonctionne, mais express vous donne une belle fonction pour s'en occuper :

app.use(express.cookieParser());

Pour mettre en place un cookie :

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

Pour effacer le cookie :

res.clearCookie('cookiename');

17 votes

La bibliothèque de cookies provient en fait de la bibliothèque sous-jacente connect ; il n'est pas nécessaire de prendre tout l'express pour obtenir l'aide aux cookies.

1 votes

En fait, la bibliothèque de cookies ne fait pas partie de connect (qui ne peut pas définir de cookie)

12 votes

cookie-parser ne fait plus partie de express et/ou connect, mais est disponible en tant qu'intergiciel : github.com/expressjs/cookie-parser

9voto

Hazy Joe Aardvark Points 1389

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

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

1 votes

Il semble que ce module soit destiné aux serveurs http. Existe-t-il un outil cookiejar pour gérer les cookies dans les clients http ? En fait, je veux dire à la librairie du client http : si vous recevez des en-têtes Set-Cookie, mémorisez-les automatiquement, puis transmettez-les aux requêtes sortantes suivantes, le cas échéant (lorsque le domaine correspond).

0 votes

Il s'agit d'une fonctionnalité de la bibliothèque client http de votre choix. Je peux vous suggérer superagent en est un bon exemple.

0 votes

J'ai abandonné l'idée de faire fonctionner cette librairie dans express après quelques heures... j'utilise connect à la place.

7voto

David Points 61

Pour qu'un séparateur de cookies fonctionne avec des cookies dont les valeurs contiennent des '=' :

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

puis pour obtenir un cookie individuel :

get_cookies(request)['my_cookie']

6voto

Tobias P. Points 3605

Les cookies sont transférés par le biais des en-têtes HTTP
Vous n'aurez qu'à analyser les en-têtes de la requête et à mettre les en-têtes de la réponse.

0 votes

Wikipédia n'est pas plus facile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X