web-dev-qa-db-ja.com

Node.js HTTPサーバーで単一のCookieを取得および設定する

単一のCookieを設定し、nodejsサーバーインスタンスに対して行われる各リクエストでその単一のCookieを読み取れるようにしたいと思います。サードパーティのライブラリを取り込むことなく、数行のコードで実行できますか?

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を使用しようとしています。

144
Corey Hart

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を設定する必要があります。

178
Corey Hart

多くのnode.js開発者が行うように、エクスプレスライブラリを使用している場合、より簡単な方法があります。詳細については、Express.jsのドキュメントページを確認してください。

上記の構文解析の例は機能しますが、expressはそれを処理するNice関数を提供します:

app.use(express.cookieParser());

Cookieを設定するには:

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

Cookieをクリアするには:

res.clearCookie('cookiename');
118
RevNoah

RevNoahは、Expressの cookie parser を使用することを提案し、最良の回答を得ました。しかし、その答えは現在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の設定や解析など、その他の操作について説明します ここ

27
Kirby

包括的な機能セットを備えた「cookies」npmモジュールを使用できます。

ドキュメントと例:
https://github.com/jed/cookies

10
zah

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
David Beckwith

Cookieは、HTTPヘッダーを介して 転送されます
要求ヘッダーを解析し、応答ヘッダーを配置するだけで済みます。

6
Tobias P.

@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モジュールを使用することに注意してください。 OPが 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);
5
Stephen Quan

ノード内の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
2
Philip Orange

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
  });
});
1
BlackBeard