Nodejs expressjs 不能从request对象中获取Cookie?

Nodejs expressjs 不能从request对象中获取Cookie?

各位大牛,请教个问题: 我expressjs开发web应用,在routes中获取不到cookie,代码如下

exports.savePage = function (req,res){
 var uid;
 var token;
 if(req.cookies){//这个永远为空,在这里断点,浏览器调试发现请求中没有cookie
    uid = req.cookies.uid;
 }
.....
 res.render(.....)//在完成render后,再查看浏览器调试请求中又出现了cookie

}

通过chrome调试模式下的调试发现,当连接服务端时一开始是没有,当完成服务端render操作后,浏览器调试又可以看到cookie已经上传,我一时弄不明白了,找了半天也没找到资料,请各位大牛给把把脉,谢谢了先 :)


3 回复

Node.js ExpressJS 无法从 request 对象中获取 Cookie?

各位大牛,请教一个问题:

我在使用 ExpressJS 开发 Web 应用时,遇到一个奇怪的问题:在路由处理函数中无法从 req.cookies 中获取到 Cookie。以下是相关代码:

exports.savePage = function (req, res) {
    var uid;
    var token;

    // 这里检查 req.cookies 是否为空
    if (req.cookies) { // 这个永远为空,在这里断点,浏览器调试发现请求中没有 cookie
        uid = req.cookies.uid;
    }

    // 其他逻辑...
    res.render('someTemplate', { /* ... */ });

    // 在完成 render 后,再查看浏览器调试请求中又出现了 cookie
}

通过 Chrome 调试模式发现,当客户端连接服务端时,一开始是没有 Cookie 的,但当完成服务端的 res.render 操作后,浏览器调试又可以看到 Cookie 已经上传。我一时弄不明白原因,找了半天也没找到相关的资料,请各位大牛帮忙看看,谢谢了!


解释

这个问题通常是因为 Express 默认情况下不会解析 Cookie。为了从 request 对象中获取 Cookie,你需要使用中间件来解析 Cookie。

你可以使用 cookie-parser 中间件来解决这个问题。以下是如何设置并使用 cookie-parser 的步骤:

  1. 安装 cookie-parser

    npm install cookie-parser
    
  2. 在你的应用中引入并使用 cookie-parser

    const express = require('express');
    const cookieParser = require('cookie-parser');
    
    const app = express();
    
    // 使用 cookie-parser 中间件
    app.use(cookieParser());
    
    // 你的路由定义
    app.get('/savePage', function (req, res) {
        var uid;
        var token;
    
        // 现在可以正确地从 req.cookies 中获取 cookie
        if (req.cookies && req.cookies.uid) {
            uid = req.cookies.uid;
        }
    
        // 其他逻辑...
        res.render('someTemplate', { /* ... */ });
    });
    
    // 启动服务器
    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });
    

通过以上步骤,你就可以正确地从 req.cookies 中获取 Cookie,并且在渲染模板之前就能读取到这些 Cookie。希望这能帮助你解决问题!


找到原因了,分享给大家 You need to use express.cookieParser() before app.router; middleware is run in order, meaning it’s never even reaching cookieParser() before your route is executed.

app.set(‘views’, __dirname + ‘/views’); app.set(‘view engine’, ‘jade’); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser()); app.use(app.router); app.use(express.static(__dirname + ‘/public’));

在Express.js中,获取客户端发送的Cookie需要正确配置中间件。req.cookies实际上是由cookie-parser中间件解析并填充的。如果你没有在应用中使用cookie-parser,那么req.cookies将始终为undefined

示例代码

  1. 安装 cookie-parser

    首先确保你已经安装了cookie-parser

    npm install cookie-parser
    
  2. 引入并使用 cookie-parser

    在你的应用入口文件(如app.jsserver.js)中,引入并使用cookie-parser

    const express = require('express');
    const cookieParser = require('cookie-parser');
    
    const app = express();
    app.use(cookieParser()); // 使用cookie-parser中间件
    
  3. 在路由中访问Cookie

    现在可以在你的路由中正确地访问req.cookies了:

    exports.savePage = function (req, res) {
      var uid;
      var token;
    
      if (req.cookies) { // 确保可以访问到cookies
         uid = req.cookies.uid;
         token = req.cookies.token;
      }
    
      // 其他逻辑...
      res.render('yourTemplate', {
        // 模板数据
      });
    };
    

解释

  • cookie-parser中间件会解析HTTP请求中的Cookie,并将其转换成一个简单的对象,存放在req.cookies中。
  • 如果你在Express应用中没有添加cookie-parser中间件,那么req.cookies将不会被填充,始终为undefined
  • 确保你的客户端请求包含正确的Cookie信息。如果客户端没有设置Cookie,服务器当然无法获取到。

通过上述步骤,你应该能够正确地从req对象中获取到Cookie。

回到顶部