Quero poder definir um único cookie e ler esse cookie único com cada solicitação feita à instância do servidor nodejs. Isso pode ser feito em algumas linhas de código, sem a necessidade de puxar uma lib de terceiros?
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/');
Apenas tentando pegar o código acima diretamente do nodejs.org e inserir um cookie nele.
javascript
cookies
node.js
Corey Hart
fonte
fonte
=
sinal de igual ( ) como em um dos cookies do Facebook, comofbm_1234123412341234=base_domain=.domain.com
.;
então pela primeira instância de=
. Esquerda é a chave, direita é valor.parts[0]
paraparts.shift()
eparts[1]
paraparts.join('=')
Se você estiver usando a biblioteca expressa, como fazem muitos desenvolvedores do node.js., existe uma maneira mais fácil. Consulte a página de documentação do Express.js para obter mais informações.
O exemplo de análise acima funciona, mas express fornece uma boa função para cuidar disso:
Para definir um cookie:
Para limpar o cookie:
fonte
cookie-parser
não faz mais parte do express e / ou da conexão, mas está disponível como middleware: github.com/expressjs/cookie-parserRevNoah teve a melhor resposta com a sugestão de usar o analisador de cookies do Express . Mas, essa resposta agora tem 3 anos e está desatualizada.
Usando o Express , você pode ler um cookie da seguinte maneira
E atualize o seu
package.json
com o seguinte, substituindo as versões relativamente mais recentes apropriadas.Mais operações, como configurar e analisar cookies, são descritas aqui e aqui
fonte
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
Como aprimoramento da resposta de @Corey Hart, reescrevi o
parseCookies()
uso:Aqui está o exemplo de trabalho:
Percebo também que o OP usa o módulo http. Se o OP estava usando restify , ele pode fazer uso de restify-cookies :
fonte
let/const
estringifyCookies
pode ser alinhado com um emmap
vez de construir uma matriz dessa maneira.Você pode usar o módulo npm "cookies", que possui um conjunto abrangente de recursos.
Documentação e exemplos em:
https://github.com/jed/cookies
fonte
Para que um divisor de cookies funcione com cookies que tenham '=' nos valores dos cookies:
para obter um cookie individual:
fonte
Os cookies são transferidos através de cabeçalhos HTTP
Você só precisará analisar os cabeçalhos de solicitação e colocar cabeçalhos de resposta.
fonte
Aqui está um patch puro de copiar e colar para gerenciar cookies no nó. Farei isso no CoffeeScript, pela beleza.
Agora você poderá manipular cookies da maneira esperada:
fonte
Deixe-me repetir esta parte da pergunta que as respostas aqui estão ignorando:
Lendo Cookies
Os cookies são lidos a partir de solicitações com o
Cookie
cabeçalho. Eles incluem apenas umname
evalue
. Devido à maneira como os caminhos funcionam, vários cookies com o mesmo nome podem ser enviados. No NodeJS, todos os cookies são inseridos como uma sequência, pois são enviados noCookie
cabeçalho. Você os separou;
. Depois de ter um cookie, tudo à esquerda dos iguais (se houver) é oname
, e tudo depois é ovalue
. Alguns navegadores aceitam um cookie sem sinal de igual e assumem o nome em branco. Espaços em branco não contam como parte do cookie. Os valores também podem ser colocados entre aspas duplas ("
). Os valores também podem conter=
. Por exemplo,formula=5+3=8
é um cookie válido.Se você não está esperando nomes duplicados, pode converter em um objeto que facilita as coisas. Então você pode acessar como
object.myCookieName
para obter o valor. Se você está esperando duplicatas, deseja fazer a iteraçãocookieEntries
. Os navegadores alimentam os cookies com prioridade decrescente, portanto, a reversão garante que o cookie de maior prioridade seja exibido no objeto. (O.slice()
objetivo é evitar a mutação da matriz.)Cookies de configurações
"Escrever" cookies é feito usando o
Set-Cookie
cabeçalho na sua resposta. Oresponse.headers['Set-Cookie']
objeto é realmente uma matriz, então você estará pressionando para isso. Ele aceita uma string, mas tem mais valores do que apenasname
evalue
. A parte mais difícil é escrever a string, mas isso pode ser feito em uma linha.Lembre-se de que você pode definir vários cookies, porque na verdade pode definir vários
Set-Cookie
cabeçalhos em sua solicitação. É por isso que é uma matriz.Nota sobre bibliotecas externas:
Se você decidir usar o
express
,,cookie-parser
oucookie
, observe que eles têm padrões que não são padrão. Os cookies analisados são sempre decodificados por URI (decodificado em porcentagem). Isso significa que, se você usar um nome ou valor com qualquer um dos seguintes caracteres:!#$%&'()*+/:<=>?@[]^`{|}
eles serão tratados de maneira diferente com essas bibliotecas. Se você estiver configurando cookies, eles serão codificados%{HEX}
. E se você estiver lendo um cookie, precisará decodificá-lo.Por exemplo, embora
[email protected]
seja um cookie válido, essas bibliotecas o codificarão comoemail=name%40domain.com
. A decodificação pode apresentar problemas se você estiver usando o%
em seu cookie. Vai ficar mutilado. Por exemplo, seu cookie que era:secretagentlevel=50%007and50%006
se tornasecretagentlevel=507and506
. Esse é um caso extremo, mas algo a ser observado se você mudar de biblioteca.Além disso, nessas bibliotecas, os cookies são configurados com um padrão, o
path=/
que significa que eles são enviados a cada solicitação de URL para o host.Se você desejar codificar ou decodificar esses valores, poderá usar
encodeURIComponent
oudecodeURIComponent
, respectivamente.Referências:
Informação adicional:
fonte
Primeiro, é necessário criar um cookie (envolvi o token dentro do cookie como exemplo) e depois defini-lo em resposta.Para usar o cookie da seguinte maneira, instale o cookieParser
O navegador o salvará na guia 'Recurso' e será usado para todas as solicitações posteriores, tendo o URL inicial como base
Também é fácil obter o cookie de uma solicitação no lado do servidor. Você precisa extrair o cookie da solicitação chamando a propriedade 'cookie' do objeto de solicitação.
fonte
Se você não se importa com o conteúdo
cookie
e deseja apenas usá-lo, tente esta abordagem limpa usandorequest
(um módulo de nó popular):fonte
jar()
nome de método atraente para obter a lista atual de cookies? Qual é o sentido das 2 invocações de solicitação? Isso é principalmente um anúncio, não uma resposta.fonte
Usando alguma feitiçaria ES5 / 6 e magia RegEx
Aqui está uma opção para ler os cookies e transformá-los em um objeto Chave, pares de valor para o lado do cliente, também pode usá-lo no lado do servidor.
Nota : Se houver um
=
valor, não se preocupe. Se houver um=
na chave, problemas no paraíso.Mais notas : alguns podem argumentar legibilidade, então divida-o como quiser.
Gosto de notas : adicionar um manipulador de erros (try catch) não faria mal.
O que está acontecendo?
iLikeCookies()
irá dividir os cookies por;
( espaço depois;
):Em seguida, mapeamos essa matriz e dividimos pela primeira ocorrência do
=
uso de captura de expressões regulares :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Em seguida, use nosso amigo `Object.fromEntries para tornar isso um objeto de pares de chaves, val.
Nooice.
fonte
Eu escrevi essa função simples, basta passar
req.headers.cookie
e nome do cookiefonte