javascript cookies node.js

javascript - Obtener y establecer una sola cookie con el servidor HTTP Node.js



cookies (10)

Aquí hay un parche limpio de copiar y pegar para administrar las cookies en el nodo. Haré esto en CoffeeScript, por la belleza.

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

Ahora podrá gestionar las cookies de la forma esperada:

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

Quiero poder configurar una única cookie y leer esa única cookie con cada solicitud realizada a la instancia del servidor nodejs. ¿Se puede hacer en unas pocas líneas de código, sin la necesidad de extraer una lib de un tercero?

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

Intentando tomar el código anterior directamente de nodejs.org y trabajando una cookie en él.


Como una mejora de la respuesta de @Corey Hart, he reescrito el parseCookies() usando:

Aquí está el ejemplo de trabajo:

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

También observo que el OP usa el módulo http. Si el OP estaba usando restify , puede hacer uso de 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);


Las cookies se transfieren a través de encabezados HTTP
Solo tendrá que analizar los encabezados de solicitud y colocar los encabezados de respuesta.


No hay un acceso rápido a la función para obtener / configurar cookies, así que se me ocurrió el siguiente truco:

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

Esto almacenará todas las cookies en el objeto de cookies, y usted necesita establecer cookies cuando escribe el encabezado.


Para obtener un divisor de cookies para que funcione con cookies que tienen ''='' en los valores de las cookies:

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

luego para obtener una cookie individual:

get_cookies(request)[''my_cookie'']


Para obtener una cookie única, este código sería más rápido que analizar todas las cookies:

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

Debería usarse como:

getSingleCookie request.headers, ''my_cookie''


Primero, debe crear una cookie (he envuelto el token dentro de la cookie como ejemplo) y luego configurarlo en respuesta. Para usar la cookie de la siguiente manera, instale cookieParser.

app.use(cookieParser());

El navegador lo guardará en su pestaña ''Recursos'' y se usará para cada solicitud a partir de entonces tomando la URL inicial como base

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

Obtener cookies de una solicitud del lado del servidor también es fácil. Debe extraer la cookie de la solicitud llamando a la propiedad ''cookie'' del objeto de solicitud.

var token = req.cookies.token; // Retrieving Token stored in cookies



RevNoah tuvo la mejor respuesta con la sugerencia de usar el github.com/expressjs/cookie-parser de Express. Pero, esa respuesta ahora tiene 3 años y está desactualizada.

Usando Express , puedes leer una cookie de la siguiente manera

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

Y actualice su package.json con lo siguiente, sustituyendo las versiones relativamente más recientes apropiadas.

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

Aquí se describen más operaciones como configurar y analizar cookies.


Si está utilizando la biblioteca express, como lo hacen muchos desarrolladores node.js, hay una manera más fácil. Consulte la página de documentación de Express.js para obtener más información.

El ejemplo de análisis anterior funciona, pero express te da una buena función para solucionarlo:

app.use(express.cookieParser());

Para establecer una cookie:

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

Para borrar la cookie:

res.clearCookie(''cookiename'');