Я хочу иметь возможность установить один файл cookie и читать этот файл при каждом запросе к экземпляру сервера nodejs. Может ли это быть сделано в несколько строк кода, без необходимости использовать стороннюю библиотеку?
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/');
Просто пытаюсь взять приведенный выше код прямо с nodejs.org и вставить в него куки.
javascript
cookies
node.js
Кори Харт
источник
источник
=
), как в одном из файлов cookie Facebookfbm_1234123412341234=base_domain=.domain.com
.;
времени на первый экземпляр=
. Слева - ключ, справа - значение.parts[0]
кparts.shift()
иparts[1]
кparts.join('=')
Если вы используете экспресс-библиотеку, как это делают многие разработчики node.js, есть более простой способ. Посетите страницу документации Express.js для получения дополнительной информации.
Приведенный выше пример разбора работает, но express дает вам хорошую функцию, чтобы позаботиться об этом:
Чтобы установить cookie:
Чтобы очистить куки:
источник
cookie-parser
больше не входит в экспресс и / или соединение, но доступно как промежуточное ПО: github.com/expressjs/cookie-parserУ RevNoah был лучший ответ с предложением использовать парсер файлов cookie Express . Но этому ответу уже 3 года, и он устарел.
Используя Express , вы можете прочитать cookie следующим образом
И обновите ваш
package.json
со следующим, заменяя соответствующие относительно последние версии.Дополнительные операции, такие как установка и анализ файлов cookie, описаны здесь и здесь.
источник
res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
В качестве дополнения к ответу @Corey Hart я переписал
parseCookies()
использование:Вот рабочий пример:
Я также отмечаю, что OP использует модуль http. Если ОП использовал restify , он может использовать restify-cookies :
источник
let/const
иstringifyCookies
может быть один, выровненный сmap
вместо того, чтобы строить массив таким способом.Вы можете использовать модуль «cookies» npm, который имеет полный набор функций.
Документация и примеры по адресу:
https://github.com/jed/cookies
источник
Чтобы заставить разделитель файлов cookie работать с файлами cookie, для которых в значении cookie указано «=»:
затем, чтобы получить отдельный файл cookie:
источник
Файлы cookie передаются через HTTP-заголовки.
Вам нужно будет только проанализировать заголовки запроса и поместить заголовки ответа.
источник
Вот аккуратное исправление копирования-вставки для управления файлами cookie в узле. Я сделаю это в CoffeeScript, для красоты.
Теперь вы сможете обрабатывать файлы cookie так, как вы ожидаете:
источник
Позвольте мне повторить эту часть вопроса, ответы на которую здесь игнорируются:
Чтение файлов cookie
Куки читаются по запросам с
Cookie
заголовком. Они включают в себя толькоname
иvalue
. Из-за способа работы путей можно отправлять несколько файлов cookie с одним и тем же именем. В NodeJS все Cookies в одной строке, как они отправляются вCookie
заголовке. Ты разделил их;
. Если у вас есть файл cookie, все слева от равенства (если есть) - этоname
, а все после -value
. Некоторые браузеры принимают cookie без знака равенства и допускают пустое имя. Пробелы не считаются частью cookie. Значения также могут быть заключены в двойные кавычки ("
). Значения также могут содержать=
. Например,formula=5+3=8
это действительный файл cookie.Если вы не ожидаете дублированных имен, вы можете преобразовать их в объект, который облегчит задачу. Затем вы можете получить доступ, как
object.myCookieName
получить значение. Если вы ожидаете дубликаты, то вы хотите выполнить итерациюcookieEntries
. Браузеры подают файлы cookie с нисходящим приоритетом, поэтому обращение гарантирует, что файл cookie с наивысшим приоритетом появляется в объекте. (.slice()
Чтобы избежать мутации массива.)Настройки Cookies
«Написание» куки осуществляется с помощью
Set-Cookie
заголовка в вашем ответе.response.headers['Set-Cookie']
Объект на самом деле массив, так что вы будете толкая к нему. Он принимает строку, но имеет больше значений, чем простоname
иvalue
. Сложнее всего написать строку, но это можно сделать в одну строку.Помните, что вы можете установить несколько файлов cookie, потому что вы можете установить несколько
Set-Cookie
заголовков в своем запросе. Вот почему это массив.Примечание по внешним библиотекам:
Если вы решили использовать
express
,cookie-parser
илиcookie
, обратите внимание , что они имеют значение по умолчанию , которые являются нестандартными. Анализируемые файлы cookie всегда декодируются по URI (в процентах). Это означает, что если вы используете имя или значение, которое имеет любой из следующих символов:!#$%&'()*+/:<=>?@[]^`{|}
они будут обрабатываться по-разному в этих библиотеках. Если вы устанавливаете куки, они кодируются с%{HEX}
. И если вы читаете печенье, вы должны их расшифровать.Например, хотя
email=name@domain.com
это допустимый файл cookie, эти библиотеки будут кодировать его какemail=name%40domain.com
. Декодирование может вызвать проблемы, если вы используете%
в своем файле cookie. Это будет искажено. Например, ваш файл cookie, который был:secretagentlevel=50%007and50%006
становитсяsecretagentlevel=507and506
. Это крайний случай, но на что следует обратить внимание при переключении библиотек.Кроме того, в этих библиотеках для файлов cookie устанавливается значение по умолчанию,
path=/
что означает, что они отправляются на каждый URL-запрос к хосту.Если вы хотите кодировать или декодировать эти значения самостоятельно, вы можете использовать
encodeURIComponent
илиdecodeURIComponent
, соответственно.Ссылки:
Дополнительная информация:
источник
Сначала нужно создать cookie (я обернул токен в cookie в качестве примера), а затем установить его в ответ. Чтобы использовать cookie следующим образом, установите cookieParser
Браузер сохранит его на своей вкладке «Ресурс» и будет использовать для каждого последующего запроса, принимая первоначальный URL-адрес в качестве базового.
Получить cookie-файл из запроса на стороне сервера тоже очень просто. Вы должны извлечь cookie-файл из запроса, вызвав свойство cookie объекта запроса.
источник
Если вас не волнует, что находится в,
cookie
и вы просто хотите его использовать, попробуйте этот чистый подход, используяrequest
(популярный модуль узла):источник
jar()
какое-нибудь подходящее имя метода для получения текущего списка файлов cookie? Какой смысл в 2 вызовах запроса? Это в основном реклама, а не ответ.источник
Использование волшебства ES5 / 6 Sorcery & RegEx Magic
Вот вариант, чтобы прочитать куки и превратить их в объект Key, пары значений для клиентской части, также может использовать его на стороне сервера.
Примечание : если
=
в значении есть значение, не беспокойтесь. Если есть=
ключ, проблема в раю.Дополнительные примечания : Некоторые могут поспорить с удобочитаемостью, поэтому разбивайте ее, как хотите.
Мне нравятся заметки : добавление обработчика ошибок (try catch) не повредит.
Что происходит?
iLikeCookies()
разделит куки на;
( пробел после;
):Затем мы отображаем этот массив и разделяем по первому вхождению
=
использования паренов с захватом регулярных выражений :[["name", "Cookie Monster"], ["likesCookies", "yes=withARandomEquals"]]
Затем используйте нашего друга `Object.fromEntries, чтобы сделать его объектом ключа, пары val.
Nooice.
источник
Я написал эту простую функцию просто передать
req.headers.cookie
и имя кукиисточник