Pobierz i ustaw pojedynczy plik Cookie z węzłem.serwer HTTP js
Chcę móc ustawić pojedynczy plik cookie i odczytać ten pojedynczy plik cookie przy każdym żądaniu złożonym do instancji serwera nodejs. Czy można to zrobić w kilku linijkach kodu, bez konieczności wyciągania lib strony trzeciej?
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/');
Po prostu staram się pobrać powyższy kod bezpośrednio z nodejs.org i włożyć do niego ciasteczko.
12 answers
Nie ma szybkiego dostępu do funkcji pobierania/ustawiania plików cookie, więc wymyśliłem następujący hack:
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/');
Spowoduje to zapisanie wszystkich plików cookie w obiekcie cookies i musisz ustawić pliki cookie podczas pisania głowy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 21:20:16
Jeśli używasz biblioteki express, tyle węzłów.Programiści js tak robią, jest łatwiejszy sposób. Sprawdź ekspres.strona dokumentacji js, aby uzyskać więcej informacji.
Powyższy przykład parsowania działa, ale express daje Ci ładną funkcję, aby się tym zająć:
app.use(express.cookieParser());
Aby ustawić plik cookie:
res.cookie('cookiename', 'cookievalue', { maxAge: 900000, httpOnly: true });
Aby wyczyścić plik cookie:
res.clearCookie('cookiename');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 16:46:19
RevNoah miał najlepszą odpowiedź z sugestią użycia parsera cookie Express . Ale ta odpowiedź ma teraz 3 lata i jest nieaktualna.
Używając Express , możesz odczytać plik cookie w następujący sposób
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']);
}
I zaktualizuj swoje package.json
z następującymi, zastępując odpowiednie stosunkowo najnowsze wersje.
"dependencies": {
"express": "4.12.3",
"cookie-parser": "1.4.0"
},
Więcej operacji, takich jak ustawianie i analizowanie plików cookie, jest opisanych tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 14:40:51
Możesz korzystać z modułu "cookies" npm, który ma kompleksowy zestaw funkcji.
Dokumentacja i przykłady na:
https://github.com/jed/cookies
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-08 10:27:49
Pliki cookie są przesyłane przez HTTP-Headers
Będziesz musiał tylko przeanalizować nagłówki żądań i umieścić nagłówki odpowiedzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 13:29:57
Aby uruchomić rozdzielacz plików cookie z plikami cookie, które mają " = "w wartościach plików cookie:
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;
};
Następnie, aby uzyskać indywidualny plik cookie:
get_cookies(request)['my_cookie']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 05:45:27
Jako uzupełnienie odpowiedzi @ Corey Hart, przepisałem parseCookies()
używając:
- String.prototyp.split - konwertuje łańcuch ciasteczek na listę
- Array.prototyp.reduce - konwertuje listę do pojedynczego obiektu
- RegExp.prototyp.exec - use regex to parse" nazwa=wartość " strings
Oto przykład roboczy:
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);
Zauważam również, że OP używa modułu http. Jeśli OP używałrestify , może użyć of 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);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-27 06:07:32
Oto zgrabna łatka copy-n-paste do zarządzania plikami cookie w węźle. Zrobię to w CoffeeScript, dla piękna.
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
Teraz będziesz mógł obsługiwać ciasteczka tak, jak byś się spodziewał:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-27 23:12:53
Jeśli nie obchodzi cię, co jest w cookie
i po prostu chcesz go użyć, spróbuj tego czystego podejścia za pomocą request
(popularny moduł węzła):
var request = require('request');
var j = request.jar();
var request = request.defaults({jar:j});
request('http://www.google.com', function () {
request('http://images.google.com', function (error, response, body){
// this request will will have the cookie which first request received
// do stuff
});
});
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 11:36:04
Inny prosty sposób JavaScript, aby uzyskać wartość cookie za pomocą klucza bez użycia regex:
function getCookieValue(k) {
var str = document.cookie; // 'k1=v1=v11=v12; k2=v2; k3=v3'
var i = str.indexOf(k + '=');
if (i === -1) {
return undefined;
}
if (i > 0 && str[i - 1] !== ' ') {
return undefined;
}
var j = i + k.length + 1;
var end = str.indexOf(';', j);
return decodeURIComponent(str.slice(j, end === -1 ? undefined : end));
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-23 07:01:06
Aby uzyskać pojedyncze ciasteczko ten kod byłby szybszy niż parsowanie wszystkich ciasteczek:
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
Należy używać w następujący sposób:
getSingleCookie request.headers, 'my_cookie'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-01 11:30:19
Najpierw należy utworzyć plik cookie (jako przykład zawinąłem token w pliku cookie), a następnie ustawić go w response.To użyj pliku cookie w następujący sposób zainstaluj cookieParser
app.use(cookieParser());
Przeglądarka zapisze go w zakładce "zasoby" i będzie używana do każdego żądania, przyjmując początkowy adres URL jako podstawę
var token = student.generateToken('authentication');
res.cookie('token', token, {
expires: new Date(Date.now() + 9999999),
httpOnly: false
}).status(200).send();
Uzyskanie pliku cookie z żądania po stronie serwera jest również łatwe.Musisz wyodrębnić plik cookie z żądania, dzwoniąc do właściwości "cookie" żądania obiekt.
var token = req.cookies.token; // Retrieving Token stored in cookies
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-07 18:39:56