183

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

4

14 に答える 14

222

Cookieの取得/設定への迅速な機能アクセスがないため、次のハックを思いつきました。

const http = require('http');

function parseCookies (request) {
    const list = {};
    const cookieHeader = request.headers?.cookie;
    if (!cookieHeader) return list;

    cookieHeader.split(`;`).forEach(function(cookie) {
        let [ name, ...rest] = cookie.split(`=`);
        name = name?.trim();
        if (!name) return;
        const value = rest.join(`=`).trim();
        if (!value) return;
        list[name] = decodeURIComponent(value);
    });

    return list;
}

const server = http.createServer(function (request, response) {
    // To Read a Cookie
    const 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);

const {address, port} = server.address();
console.log(`Server running at http://${address}:${port}`);

これにより、すべてのCookieがCookieオブジェクトに保存されるため、ヘッドを作成するときにCookieを設定する必要があります。

于 2010-08-04T19:38:37.323 に答える
129

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

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

app.use(express.cookieParser());

クッキーを設定するには:

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

クッキーをクリアするには:

res.clearCookie('cookiename');
于 2012-07-20T16:46:19.613 に答える
45

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

于 2015-09-30T21:29:12.333 に答える
14

@Corey Hart の回答を強化するために、次のように書き直しましたparseCookies()

作業例は次のとおりです。

let http = require('http');

function parseCookies(str) {
  let rx = /([^;=\s]*)=([^;]*)/g;
  let obj = { };
  for ( let m ; m = rx.exec(str) ; )
    obj[ m[1] ] = decodeURIComponent( m[2] );
  return obj;
}

function stringifyCookies(cookies) {
  return Object.entries( cookies )
    .map( ([k,v]) => k + '=' + encodeURIComponent(v) )
    .join( '; ');
}

http.createServer(function ( request, response ) {
  let 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);
于 2015-07-27T06:07:32.953 に答える
9

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

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

于 2011-08-08T10:27:49.463 に答える
7

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']
于 2013-03-22T05:45:27.900 に答える
6

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

于 2010-08-04T13:29:57.240 に答える
2

これは、ノードで 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
于 2012-08-27T23:12:53.803 に答える
0
var cookie = 'your_cookie';
var cookie_value;
var i = request.headers.indexOf(cookie+'=');
if (i != -1) {
  var eq = i+cookie.length+1;
  var end = request.headers.indexOf(';', eq);
  cookie_value = request.headers.substring(eq, end == -1 ? undefined : end);
}
于 2013-03-01T11:30:19.057 に答える
0

この単純な関数を書いたのは、パス req.headers.cookieクッキー名だけです

const getCookieByName =(cookies,name)=>{
    const arrOfCookies = cookies.split(' ')
    let yourCookie = null

    arrOfCookies.forEach(element => {
        if(element.includes(name)){
            yourCookie = element.replace(name+'=','')
        }
    });
    return yourCookie
}
于 2020-05-30T21:22:01.860 に答える
-1

最初に Cookie を作成する必要があります (例として Cookie 内にトークンをラップしました)。

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
于 2016-09-07T18:39:56.970 に答える