2010-08-03 130 views
125

我希望能够设置一个cookie,并且每次向nodejs服务器实例发出的请求都读取该cookie。它可以在几行代码中完成,而无需拉入第三方库?使用Node.js获取并设置一个Cookie HTTP服务器

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加入其中。

回答

156

还有就是要获取/设置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到饼干对象,你需要你的时候设置Cookie写头。

+9

如果cookie的值包含一个等于('=')符号如Facebook的饼干等'fbm_1234123412341234 = BASE_DOMAIN = .domain.com'之一上面的代码将不正确地工作。 – Eye 2012-10-03 09:31:39

+3

不要cookie值必须被URL编码/百分比编码? = doockie值在这种情况下是无效的,对吧? – les2 2013-03-13 19:52:05

+2

在这种情况下,按';'分割,然后按'='的第一个实例分割。左边是关键,右边是价值。 – lwansbrough 2013-06-03 19:33:03

10

您可以使用“cookies”npm模块,它具有一组全面的功能。在

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

+1

看起来这个模块是专门用于HTTP服务器的。是否有一个cookiejar工具来处理HTTP客户端中的cookies?基本上,我只能告诉http客户端lib:*如果你得到任何Set-Cookie头文件,请自动记住它们,然后根据需要传递随后的出站请求(当域匹配时)* – Cheeso 2012-09-09 16:02:08

+0

这将是您的一项功能首选http客户端库。 我可以建议[superagent](https://github.com/visionmedia/superagent#persisting-an-agent-with-cookies-ie-sessions)作为一个很好的例子。 – zah 2012-09-09 20:51:23

+0

让我们在几个小时之后使用这个库来运行express ...使用connect来代替。 – enko 2013-08-27 21:45:28

112

如果您使用的快递库,许多开发人员的Node.js做,还有一个更简单的方法。查看Express.js文档页面以获取更多信息。

上述作品,但表达解析例子给你一个很好的功能,采取照顾:

app.use(express.cookieParser()); 

设置cookie:

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

要清除的cookie:

res.clearCookie('cookiename'); 
+13

cookie库实际上是从底层库连接;你不需要全部使用快递来获取cookie助手。 – Ajax 2012-09-03 16:40:13

+1

实际上cookie库不是连接的一部分(它不能设置cookie) – framp 2012-11-01 01:58:53

+9

它实际上是 - http://www.senchalabs.org/connect/cookieParser.html – Nijikokun 2013-07-12 19:03:27

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 
+3

只需将该代码复制粘贴到http://coffeescript.org/上的TRY COFFESCRIPT选项卡中即可。 你的回答确实对我有帮助,如果你知道javascript,咖啡脚本就不难读懂。 – Mattijs 2014-05-25 11:54:45

-1

为了得到一个cookie这个代码将是比解析所有的饼干更快:

getSingleCookie = (cookie, name) -> 
    vIx = cookie.indexOf "#{name}=" 
    if vIx != -1 
    egalIx = vIx+name.length+1 
    colIx = cookie.indexOf ';', egalIx 
    v = if colIx == -1 
     cookie.substring egalIx 
    else 
     cookie.substring egalIx, colIx 
    return v 

应该使用这样的:

getSingleCookie request.headers, 'my_cookie' 
4

为了得到一个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'] 
3

,以增强@Corey哈特答案,我已经改写了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); 
16

RevNoah不得不用快递的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" 
    }, 

更多操作被描述here

+0

问题问如何获取__and__设置。要设置使用这个:'res.cookie('cookieName',cookieValue,{maxAge:900000,httpOnly:true});'' – 2017-12-14 19:11:48

-1

首先一个需要创建的cookie(我已包裹令牌内的cookie作为一个例子),并然后将其设置在response.To使用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 
相关问题