使用 Node.js HTTP 服务器获取和设置单个 Cookie

IT技术 javascript node.js cookies httpserver
2021-01-18 00:57:39

我希望能够设置一个 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 放入其中。

6个回答

没有获取/设置 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/');

这会将所有cookies存储到cookies对象中,写head时需要设置cookies。

如果 cookie 的值包含等号 ( =),如 Facebook 的 cookie 之一,则上述代码将无法正常工作fbm_1234123412341234=base_domain=.domain.com
2021-03-19 00:57:39
我遇到同样的问题,因为@Eye,而不是去@iLoch我的路线切换parts[0]parts.shift()parts[1]parts.join('=')
2021-03-27 00:57:39
cookie 值不必经过 URL 编码/百分比编码吗?= 在这种情况下 doockie 值将无效,对吗?
2021-03-28 00:57:39
在那种情况下,由;then 的第一个实例拆分=左边是关键,右边是value。
2021-04-11 00:57:39
给出的代码有严重的错误,人们继续复制它。查看我的上次更新
2021-04-12 00:57:39

如果您使用 express 库,就像许多 node.js 开发人员所做的那样,有一种更简单的方法。查看 Express.js 文档页面以获取更多信息。

上面的解析示例有效,但 express 为您提供了一个很好的功能来处理这个问题:

app.use(express.cookieParser());

要设置 cookie:

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

要清除 cookie:

res.clearCookie('cookiename');
由于需要安装 express 只是为了使用 cookie 而投反对票
2021-03-20 00:57:39
实际上 cookie 库不是连接的一部分(不能设置 cookie)
2021-03-26 00:57:39
cookie-parser不再是 express 和/或 connect 的一部分,但可以作为中间件使用:github.com/expressjs/cookie-parser
2021-04-01 00:57:39
cookie 库其实是来自底层库connect;你不需要采取所有的快递来获得 cookie helper。
2021-04-02 00:57:39
在此示例中,如何“获取”cookie?为了完整性和回答问题。
2021-04-02 00:57:39

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

问题询问如何获取设置。要设置使用这个:res.cookie('cookieName', cookieValue, { maxAge: 900000, httpOnly: true });
2021-03-15 00:57:39
您可以在每个会话中设置和获取 cookie(不需要知道和处理密钥)吗?
2021-04-07 00:57:39

作为对@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 module。如果 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);
3.5 年后,现在为未来的观众提供一些建议。使用let/constandstringifyCookies可以是一个内衬,map而不是这样构建一个数组。
2021-04-04 00:57:39

您可以使用“cookies”npm module,该module具有全面的功能集。

文档和示例位于:https :
//github.com/jed/cookies

看起来该module旨在用于 http 服务器。是否有用于处理 http 客户端中的 cookie 的 cookiejar 工具?基本上我会告诉 http 客户端库:如果您获得任何 Set-Cookie 标头,请自动记住它们,然后根据需要(当域匹配时)传递后续出站请求。
2021-03-18 00:57:39
这将是您选择的 http 客户端库的一个功能。我可以建议superagent作为一个很好的例子。
2021-03-29 00:57:39
放弃尝试让这个库在几个小时后在 express 中工作......改用连接。
2021-03-29 00:57:39