[javascript] Node.js HTTP 서버로 단일 쿠키 가져 오기 및 설정

단일 쿠키를 설정하고 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에서 직접 위의 코드를 가져 와서 쿠키를 작성하십시오.



답변

쿠키 가져 오기 / 설정에 대한 빠른 기능 액세스가 없으므로 다음 해킹을 생각해 냈습니다.

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

이렇게하면 모든 쿠키가 쿠키 개체에 저장되며 헤드를 작성할 때 쿠키를 설정해야합니다.


답변

많은 node.js 개발자가하는 것처럼 익스프레스 라이브러리를 사용하는 경우 더 쉬운 방법이 있습니다. 자세한 내용은 Express.js 설명서 페이지를 확인하십시오.

위의 구문 분석 예제는 작동하지만 express는이를 처리하는 훌륭한 기능을 제공합니다.

app.use(express.cookieParser());

쿠키를 설정하려면

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

쿠키를 지우려면 :

res.clearCookie('cookiename');


답변

RevNoah는 Express의 쿠키 파서 를 사용하는 것이 가장 좋습니다 . 그러나 그 대답은 이제 3 살이며 오래되었습니다.

Express를 사용하면 다음과 같이 쿠키를 읽을 수 있습니다

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"
  },

쿠키 설정 및 구문 분석과 같은 추가 작업은 여기
여기에 설명 되어 있습니다.


답변

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


답변

포괄적 인 기능 세트가있는 “쿠키”npm 모듈을 사용할 수 있습니다.

https://github.com/jed/cookies의 설명서 및 예제


답변

쿠키 스플리터가 쿠키 값에 ‘=’인 쿠키를 사용하려면 :

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

개별 쿠키를 얻으려면 다음을 수행하십시오.

get_cookies(request)['my_cookie']


답변

쿠키는 HTTP 헤더를 통해 전송 됩니다
. 요청 헤더를 구문 분석하고 응답 헤더를 넣어야합니다.