无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie

Posted

技术标签:

【中文标题】无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie【英文标题】:Unable to set cookie in browser using request and express modules in NodeJS 【发布时间】:2016-07-02 07:39:37 【问题描述】:

我有一个用 express 编写的客户端和一个服务器节点。客户端使用请求模块与服务器通信,服务器将响应发送回客户端。在服务器代码中,我将 cookie 发送回客户端。但我无法在浏览器中看到 cookie。在客户端 req.cookies 给

服务器代码:

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.get('/test-cookie', function(req, res) 
    res.cookie('abc', 'xyz').send('Cookie is set');
);
app.listen(9000);

客户端代码:

var express = require('express');
var request = require('request');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());
app.get('/', function(req, res) 
    request(
        url: 'http://localhost:9000/test-cookie',
        method: 'GET'
    , function(error, response, body) 
        if (error) 
            res.send(
                msg: error
            );
         else 
            if (200 == response.statusCode) 
                console.log(req.cookies);
            
        
    );
);
app.listen(7000);

【问题讨论】:

【参考方案1】:

response.cookies 是 SET cookie,如果你想从响应对象获取 cookie,你将不得不依赖 response.headers['set-cookie']

【讨论】:

【参考方案2】:

客户端浏览器首次访问7000 api 将不包含任何cookie,因此req.cookies 将记录,因此我们必须在res 中设置cookie,以便客户端浏览器发送cookie休息请求。

解决方案(客户端代码):

if (200 == response.statusCode) 

    // For first request it will be empty 
    console.log(req.cookies);

    /* fetching the cookie from the response header
     * and setting in res to be set in the browser
     */
    var c = response.headers['set-cookie'];
    res.set('set-cookie',c[0]);

    res.send('Done');


说明: 您正在做的是尝试从不包含任何 cookie 的 req 获取 cookie。您通过点击9000 api 获得的response 对象将包含cookie。因此,对于客户端浏览器,您必须将 cookie 从 response 设置为 res

【讨论】:

以上是关于无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章

无法使用一个可读流写入 Node JS 中的两个不同目标

nodejs使用request和bluebird编写的http请求模块

单引号字符串中的双引号 - NodeJs

如何使用nodejs和request将不同请求的响应放在同一个文档中?

使用 nodejs 'request' 读取 JSON 响应的属性

节点 JS 查询 request.query 为空