Je veux pouvoir définir un seul cookie et lire ce cookie unique à chaque demande adressée à l'instance de serveur nodejs. Cela peut-il être fait en quelques lignes de code, sans avoir besoin de tirer 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.
javascript
cookies
node.js
Corey Hart
la source
la source
=
signe égal ( ) comme dans l'un des cookies de Facebook commefbm_1234123412341234=base_domain=.domain.com
.;
là par la première instance de=
. La gauche est la clé, la droite est la valeur.parts[0]
àparts.shift()
etparts[1]
àparts.join('=')
Si vous utilisez la bibliothèque express, comme le font de nombreux développeurs node.js, il existe un moyen plus simple. Consultez la page de documentation d'Express.js pour plus d'informations.
L'exemple d'analyse ci-dessus fonctionne mais express vous offre une fonction intéressante pour vous en occuper:
Pour définir un cookie:
Pour effacer le cookie:
la source
cookie-parser
ne fait plus partie d'express et / ou connect, mais est disponible en tant que middleware: github.com/expressjs/cookie-parserRevNoah a eu la meilleure réponse avec la suggestion d'utiliser l' analyseur de cookies d'Express . Mais, cette réponse a maintenant 3 ans et est obsolète.
En utilisant Express , vous pouvez lire un cookie comme suit
Et mettez à jour votre
package.json
avec ce qui suit, en remplaçant les versions relativement récentes appropriées.D'autres opérations telles que la configuration et l'analyse des cookies sont décrites ici et ici
la source
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
Pour améliorer la réponse de @Corey Hart, j'ai réécrit l'
parseCookies()
utilisation:Voici l'exemple de travail:
Je note également que l'OP utilise le module http. Si l'OP utilisait restify , il peut utiliser restify-cookies :
la source
let/const
etstringifyCookies
peut être doublé d'unmap
au lieu de créer un tableau de cette façon.Vous pouvez utiliser le module "cookies" npm, qui dispose d'un ensemble complet de fonctionnalités.
Documentation et exemples sur:
https://github.com/jed/cookies
la source
Pour faire fonctionner un séparateur de cookies avec les cookies qui ont «=» dans les valeurs de cookie:
puis pour obtenir un cookie individuel:
la source
Les cookies sont transférés via les en-têtes HTTP.
Vous n'aurez qu'à analyser les en-têtes de requête et mettre les en-têtes de réponse.
la source
Voici un correctif copier-coller pour gérer les cookies dans node. Je vais le faire dans CoffeeScript, pour la beauté.
Vous pourrez désormais gérer les cookies comme vous vous en doutez:
la source
Permettez-moi de répéter cette partie de la question dont les réponses ici ignorent:
Lire les cookies
Les cookies sont lus à partir des demandes avec l'en-
Cookie
tête. Ils incluent uniquement unname
etvalue
. En raison du fonctionnement des chemins, plusieurs cookies du même nom peuvent être envoyés. Dans NodeJS, tous les cookies sont en une seule chaîne lorsqu'ils sont envoyés dans l'en-Cookie
tête. Vous les avez séparés;
. Une fois que vous avez un cookie, tout ce qui se trouve à gauche de l'égal (si présent) est lename
, et tout ce qui suit est levalue
. Certains navigateurs acceptent un cookie sans signe égal et présument que le nom est vide. Les espaces ne comptent pas comme faisant partie du cookie. Les valeurs peuvent également être placées entre guillemets ("
). Les valeurs peuvent également contenir=
. Par exemple,formula=5+3=8
est un cookie valide.Si vous n'attendez pas de noms dupliqués, vous pouvez convertir en un objet, ce qui facilite les choses. Ensuite, vous pouvez accéder à comme
object.myCookieName
pour obtenir la valeur. Si vous prévoyez des doublons, vous souhaitez effectuer une itérationcookieEntries
. Les navigateurs alimentent les cookies par ordre de priorité décroissante, donc l'inversion garantit que le cookie de priorité la plus élevée apparaît dans l'objet. (Le but.slice()
est d'éviter la mutation du tableau.)Cookies de paramètres
"L'écriture" des cookies se fait en utilisant l'en-
Set-Cookie
tête dans votre réponse. L'response.headers['Set-Cookie']
objet est en fait un tableau, vous y pousserez donc. Il accepte une chaîne mais a plus de valeurs que justename
etvalue
. Le plus difficile est d'écrire la chaîne, mais cela peut être fait en une seule ligne.N'oubliez pas que vous pouvez définir plusieurs cookies, car vous pouvez en fait définir plusieurs en-
Set-Cookie
têtes dans votre demande. C'est pourquoi c'est un tableau.Remarque sur les bibliothèques externes:
Si vous décidez d'utiliser le
express
,,cookie-parser
oucookie
, notez que leurs valeurs par défaut ne sont pas standard. Les cookies analysés sont toujours décodés par URI (décodés en pourcentage). Cela signifie que si vous utilisez un nom ou une valeur!#$%&'()*+/:<=>?@[]^`{|}
contenant l' un des caractères suivants: ils seront traités différemment avec ces bibliothèques. Si vous définissez des cookies, ils sont encodés avec%{HEX}
. Et si vous lisez un cookie, vous devez le décoder.Par exemple, tant que
[email protected]
est un cookie valide, ces bibliothèques l'encoderont commeemail=name%40domain.com
. Le décodage peut présenter des problèmes si vous utilisez le%
dans votre cookie. Ça va être mutilé. Par exemple, votre cookie qui était:secretagentlevel=50%007and50%006
devientsecretagentlevel=507and506
. C'est un cas limite, mais quelque chose à noter en cas de changement de bibliothèque.De plus, sur ces bibliothèques, les cookies sont définis par défaut,
path=/
ce qui signifie qu'ils sont envoyés à chaque demande d'URL à l'hôte.Si vous souhaitez encoder ou décoder ces valeurs vous-même, vous pouvez utiliser respectivement
encodeURIComponent
oudecodeURIComponent
.Références:
Information additionnelle:
la source
Tout d'abord, il faut créer un cookie (j'ai enveloppé le jeton dans le cookie comme exemple), puis le définir en réponse.Pour utiliser le cookie de la manière suivante, installez cookieParser
Le navigateur l'aura sauvegardé dans son onglet 'Ressource' et sera utilisé pour chaque demande par la suite en prenant l'URL initiale comme base
Obtenir un cookie à partir d'une requête côté serveur est également facile. Vous devez extraire le cookie de la requête en appelant la propriété 'cookie' de l'objet de requête.
la source
Si vous ne vous souciez pas de ce qu'il y a dans le
cookie
et que vous voulez juste l'utiliser, essayez cette approche propre en utilisantrequest
(un module de nœud populaire):la source
jar()
un nom de méthode mignonne pour obtenir la liste actuelle des cookies? Quel est l'intérêt des 2 invocations de requête? C'est surtout une publicité, pas une réponse.la source
Utilisation de certains ES5 / 6 Sorcery & RegEx Magic
Voici une option pour lire les cookies et les transformer en un objet de paires clé, valeur pour le côté client, pourrait également l'utiliser côté serveur.
Remarque : s'il y a un
=
dans la valeur, pas de soucis. S'il y a un=
problème dans la clé, au paradis.Plus de notes : Certains peuvent discuter de la lisibilité, alors décomposez-la comme vous le souhaitez.
J'aime les notes : L'ajout d'un gestionnaire d'erreurs (try catch) ne ferait pas de mal.
Que se passe-t-il?
iLikeCookies()
divisera les cookies par;
( espace après;
):Ensuite, nous mappons ce tableau et le divisons par la première occurrence de l'
=
utilisation de parens de capture de regex :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Ensuite, utilisez notre ami `Object.fromEntries pour en faire un objet de paires clé, val.
Nooice.
la source
J'ai écrit cette fonction simple juste passer
req.headers.cookie
et le nom du cookiela source