2010-04-11 55 views

回答

6

只需在响应标题中从Set-Cookie参数中获取cookie,并将它们发送回未来请求。不应该很难。

+12

如果不难,也许你可以在答案中提供一个示例代码片段? – 2016-04-28 05:00:56

27

简答:没有。并不是很好。

我实现了这个作为npm的一部分,以便我可以从github下载tarball。下面是这是否代码:https://github.com/isaacs/npm/blob/master/lib/utils/fetch.js#L96-100

var cookie = get(response.headers, "Set-Cookie") 
if (cookie) { 
    cookie = (cookie + "").split(";").shift() 
    set(opts.headers, "Cookie", cookie) 
} 

该文件的得到了很多具体的NPM-东西(日志,设置等),但它应该告诉你的总体思路。基本上,我正在收集cookie,以便在重新定向时可以在下一个请求中发送它们。

我已经与Mikeal Rogers讨论了如何将这种功能添加到他的“request”util中,并完全支持由文件系统支持的cookiejar,但它确实非常棘手。你必须跟踪哪些域发送cookie,等等。

这可能永远不会直接包含在节点中,因此。但留意用户空间的发展。

编辑:现在,默认情况下在请求中支持。

4

如果你正在寻找做饼干客户端可以使用https://github.com/mikeal/request

M.

+1

我按照他们的文档中描述的“jar:true”来尝试它,但是不工作... – 2014-07-13 12:59:47

2

下面的代码演示如何使用的cookie从服务器端,下面是从HTTP客户端解析饼干演示API服务器检查Cookie哈希:

var express = require("express"), 
app  = express(), 
hbs = require('hbs'), 
mongoose = require('mongoose'), 
port = parseInt(process.env.PORT, 10) || 4568; 

app.configure(function() { 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.static(__dirname + '/public_api')); 
app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 
app.get('/api', function (req, res) { 
    var cookies = {}; 
    req.headers.cookie && req.headers.cookie.split(';').forEach(function(cookie) { 
     var parts = cookie.split('='); 
     cookies[ parts[ 0 ].trim() ] = (parts[ 1 ] || '').trim(); 
    }); 
    if (!cookies['testcookie']) { 
     console.log('First request'); 
     res.cookie('testcookie','testvaluecookie',{ maxAge: 900000, httpOnly: true }); 
     res.end('FirstRequest'); 
    } else { 
     console.log(cookies['testcookie']); 
     res.end(cookies['testcookie']); 
    } 
}); 

app.listen(port); 

在客户端,只需进行正常的请求,上述服务器API,我使用的请求模块,默认情况下它传输的cookie为每个请求。

request(options, function(err, response, body) {  
    console.log(util.inspect(response.headers)); 
    res.render("index.html", {layout: false,user: { 
     username: req.session.user + body 
    }}); 
}); 
2

在这里其他的答案提出不包括大量的特殊情况下的cookies

自制的解决方案,一个功能完整的解决方案,可以轻松突破,缺乏大量的标准功能,如作为持久性。

由于mentioned by isaacsrequest模块现在有真正的cookie支持。 They provide examples with cookies on their Github page。这些示例解释了如何通过将"tough-cookie" cookie jar添加到您的请求来启用Cookie支持。

注:饼干罐包含并帮助您管理您的饼干。

引述其Readme(截至2015年4月):

Cookies是默认情况下禁用(否则,他们将在 后续请求中使用)。要启用cookie,请将jar设置为true(或者在 默认值或选项中)并安装tough-cookie

Cookie管理通过tough-cookie module提供。它是一个稳定的,功能完整的Cookie管理工具,实现"HTTP State Management Mechanism" - RFC 6265。它甚至提供了多种选项来坚持(存储)cookies,使用cookie store