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 obtener una biblioteca de terceros?
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/');
Solo trato de tomar el código anterior directamente de nodejs.org y aplicarle una cookie.
javascript
cookies
node.js
Corey Hart
fuente
fuente
=
signo igual ( ) como en una de las cookies de Facebook comofbm_1234123412341234=base_domain=.domain.com
.;
entonces por la primera instancia de=
. Izquierda es clave, derecha es valor.parts[0]
aparts.shift()
yparts[1]
aparts.join('=')
Si está utilizando la biblioteca express, como lo hacen muchos desarrolladores de 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 le brinda una buena función para encargarse de eso:
Para configurar una cookie:
Para borrar la cookie:
fuente
cookie-parser
ya no es parte de express y / o connect, pero está disponible como middleware: github.com/expressjs/cookie-parserRevNoah tuvo la mejor respuesta con la sugerencia de usar el analizador de cookies de Express . Pero esa respuesta tiene ahora 3 años y está desactualizada.
Con Express , puede leer una cookie de la siguiente manera
Y actualice su
package.json
con lo siguiente, sustituyendo las versiones relativamente recientes apropiadas.Más operaciones como la configuración y el análisis cookies se describen aquí y aquí
fuente
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
Como una mejora a la respuesta de @Corey Hart, he reescrito el
parseCookies()
uso de:Aquí está el ejemplo de trabajo:
También noto que el OP usa el módulo http. Si el OP estaba usando restify , puede hacer uso de restify-cookies :
fuente
let/const
ystringifyCookies
puede estar alineado con un enmap
lugar de construir una matriz de esa manera.Puede usar el módulo npm "cookies", que tiene un conjunto completo de características.
Documentación y ejemplos en:
https://github.com/jed/cookies
fuente
Para que un divisor de cookies funcione con cookies que tienen '=' en los valores de cookies:
luego para obtener una cookie individual:
fuente
Las cookies se transfieren a través de encabezados HTTP
. Solo tendrá que analizar los encabezados de solicitud y colocar encabezados de respuesta.
fuente
Aquí hay un parche limpio de copiar y pegar para administrar las cookies en el nodo. Lo haré en CoffeeScript, por la belleza.
Ahora podrá manejar las cookies tal como esperaría:
fuente
Permítanme repetir esta parte de la pregunta que las respuestas aquí ignoran:
Cookies de lectura
Las cookies se leen de las solicitudes con el
Cookie
encabezado. Solo incluyen aname
yvalue
. Debido a la forma en que funcionan las rutas, se pueden enviar múltiples cookies del mismo nombre. En NodeJS, todas las cookies en una sola cadena a medida que se envían en elCookie
encabezado. Los dividiste con ellos;
. Una vez que tiene una cookie, todo a la izquierda de los iguales (si está presente) es elname
, y todo lo que sigue es elvalue
. Algunos navegadores aceptarán una cookie sin signo igual y supondrán que el nombre está en blanco. Los espacios en blanco no cuentan como parte de la cookie. Los valores también se pueden incluir entre comillas dobles ("
). Los valores también pueden contener=
. Por ejemplo,formula=5+3=8
es una cookie válida.Si no espera nombres duplicados, puede convertirlos en un objeto que facilite las cosas. Entonces puede acceder como
object.myCookieName
para obtener el valor. Si espera duplicados, entonces desea iterarcookieEntries
. Los navegadores alimentan las cookies con prioridad descendente, por lo que la inversión asegura que la cookie de mayor prioridad aparezca en el objeto. (El.slice()
objetivo es evitar la mutación de la matriz).Cookies de configuración
Las cookies de "escritura" se realizan utilizando el
Set-Cookie
encabezado en su respuesta. Elresponse.headers['Set-Cookie']
objeto es en realidad una matriz, por lo que lo empujará hacia él. Acepta una cadena pero tiene más valores que soloname
yvalue
. La parte más difícil es escribir la cadena, pero esto se puede hacer en una línea.Recuerde que puede configurar múltiples cookies, porque en realidad puede configurar múltiples
Set-Cookie
encabezados en su solicitud. Por eso es una matriz.Nota sobre bibliotecas externas:
Si decide utilizar el
express
,cookie-parser
ocookie
, tenga en cuenta que tienen valores predeterminados que no son estándar. Las cookies analizadas siempre se decodifican por URI (decodificación porcentual). Eso significa que si usa un nombre o valor que tenga alguno de los siguientes caracteres:!#$%&'()*+/:<=>?@[]^`{|}
se manejarán de manera diferente con esas bibliotecas. Si está configurando cookies, están codificadas con%{HEX}
. Y si estás leyendo una cookie, debes decodificarla.Por ejemplo, si bien
[email protected]
es una cookie válida, estas bibliotecas la codificarán comoemail=name%40domain.com
. La decodificación puede presentar problemas si está utilizando el%
en su cookie. Se destrozará. Por ejemplo, su cookie que fue: sesecretagentlevel=50%007and50%006
conviertesecretagentlevel=507and506
. Ese es un caso extremo, pero algo a tener en cuenta si se cambia de biblioteca.Además, en estas bibliotecas, las cookies se configuran de manera predeterminada, lo
path=/
que significa que se envían en cada solicitud de URL al host.Si desea codificar o decodificar estos valores usted mismo, puede usar
encodeURIComponent
odecodeURIComponent
, respectivamente.Referencias
Información Adicional:
fuente
Primero es necesario crear una cookie (como ejemplo, he envuelto el token dentro de la cookie) y luego configurarla en respuesta. Para usar la cookie de la siguiente manera, instale cookieParser
El navegador lo guardará en su pestaña 'Recurso' y luego se usará para cada solicitud tomando la URL inicial como base
También es fácil obtener cookies de una solicitud en el lado del servidor. Debe extraer la cookie de la solicitud llamando a la propiedad 'cookie' del objeto de solicitud.
fuente
Si no le importa lo que hay en el
cookie
y solo quiere usarlo, intente este enfoque limpio usandorequest
(un módulo de nodo popular):fuente
jar()
algún nombre cursi para obtener la lista actual de cookies? ¿Cuál es el punto de las 2 invocaciones de solicitud? Esto es principalmente un anuncio, no una respuesta.fuente
Uso de algunos ES5 / 6 Magia y magia mágica
Aquí hay una opción para leer las cookies y convertirlas en un objeto de clave, pares de valores para el lado del cliente, también podría usarlo en el lado del servidor.
Nota : Si hay un
=
valor en el valor, no se preocupe. Si hay una=
clave, problemas en el paraíso.Más notas : Algunos pueden argumentar legibilidad, así que desglosarlo como desee.
Me gustan las notas : Agregar un controlador de errores (intente capturar) no estaría de más.
Que esta pasando?
iLikeCookies()
dividirá las cookies por;
( espacio después;
):Luego mapeamos esa matriz y dividimos por primera vez el
=
uso de expresiones regulares que capturan parens :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Luego use nuestro amigo `Object.fromEntries para hacer de este un objeto de clave, pares de val.
Nooice
fuente
Escribí esta simple función solo pasa
req.headers.cookie
y el nombre de la cookiefuente