Получить и установить один файл cookie с HTTP-сервером Node.js - PullRequest
145 голосов
/ 03 августа 2010

Я хочу иметь возможность установить один файл 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 и добавить в него файл cookie.

Ответы [ 11 ]

179 голосов
/ 04 августа 2010

Нет быстрого доступа к функции получения / настройки файлов cookie, поэтому я пришел к следующему хаку:

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

Это сохранит все файлы cookie в объекте cookie, и вам необходимо установить файлы cookie приты пишешь голову.

118 голосов
/ 20 июля 2012

Если вы используете экспресс-библиотеку, как это делают многие разработчики node.js, есть более простой способ.Посетите страницу документации Express.js для получения дополнительной информации.

Приведенный выше пример синтаксического анализа работает, но express дает вам хорошую функцию, чтобы позаботиться об этом:

app.use(express.cookieParser());

Чтобы установить cookie:

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

Чтобы очистить куки:

res.clearCookie('cookiename');
27 голосов
/ 01 октября 2015

RevNoah получил лучший ответ с предложением использовать парсер cookie Express . Но этому ответу уже 3 года, и он устарел.

Используя Express , вы можете прочитать cookie следующим образом

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

И обновите свой package.json следующим, заменив соответствующие относительно последние версии.

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

Дополнительные операции, такие как установка и анализ файлов cookie, описаны здесь и здесь

10 голосов
/ 08 августа 2011

Вы можете использовать модуль «cookies» npm, который имеет полный набор функций.

Документация и примеры приведены по адресу:https://github.com/jed/cookies

6 голосов
/ 22 марта 2013

Чтобы разделитель файлов cookie работал с файлами cookie, для которых в значении 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;
};

затем, чтобы получить отдельный файл cookie:

get_cookies(request)['my_cookie']
6 голосов
/ 04 августа 2010

Файлы cookie передаются через HTTP-заголовки
Вам нужно будет только проанализировать заголовки запроса и поместить заголовки ответа.

5 голосов
/ 27 июля 2015

В качестве дополнения к ответу @Corey Hart я переписал parseCookies(), используя:

Вот рабочий пример:

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

Также отмечу, что OP использует модуль http. Если ОП использовал restify , он может использовать 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);
2 голосов
/ 28 августа 2012

Вот аккуратное исправление copy-n-paste для управления файлами cookie в узле. Я сделаю это в CoffeeScript, для красоты.

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

Теперь вы сможете обрабатывать файлы cookie так, как вы ожидаете:

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
1 голос
/ 07 сентября 2018

Если вам все равно, что находится в cookie, и вы просто хотите его использовать, попробуйте этот чистый подход, используя request (популярный модуль узла):

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
  });
});
0 голосов
/ 07 сентября 2016

Сначала необходимо создать cookie (я обернул токен в cookie в качестве примера), а затем установить его в ответ. Чтобы использовать cookie следующим образом, установите cookieParser

app.use(cookieParser());

Браузер сохранит его на вкладке «Ресурс» и будет использовать для каждого последующего запроса, принимая первоначальный URL-адрес в качестве базового

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

Получить cookie из запроса на стороне сервера тоже очень просто. Вы должны извлечь cookie из запроса, вызвав свойство cookie объекта запроса.

var token = req.cookies.token; // Retrieving Token stored in cookies
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...