【问题标题】:req.cookies returns undefined but cookies are setreq.cookies 返回 undefined 但 cookie 已设置
【发布时间】:2018-03-15 23:17:48
【问题描述】:

我在我的快递应用程序中使用cookie-parser。当请求根页面时,我使用res.cookie(name, value) 在cookie 上设置了一个随机数,它设置得很好(我在浏览器控制台上检查了)。但是当我尝试登录 req.cookie 时,它总是返回 undefined。

这是我的代码:

routes.js

var express = require('express')
var router = express.Router()

var movieTrailer = require('movie-trailer');

var Promise = require('bluebird');
var logs = require('log-switch');
var fs = require('fs');
//var cookieParser = require('cookie-parser');

//Setup x-ray for scraping
var Xray = require('x-ray');
var x = Xray();

var debug = false;

router.get('/', (req, res) => {
  console.log('Page requested!');
  console.log('Cookies: ', req.headers.cookies); // For some reason this returns undefined

  var scrapeMovies = function(){
    return new Promise((resolve, reject) =>{
      fs.readFile('moviesRT.json', (err,data) =>{
        var movies = JSON.parse(data);
        resolve(movies);
      });
    });
  };

scrapeMovies().then(
    movies => {
      var randomInt = Math.floor(Math.random() * movies.length);
      res.cookie('randomInt', randomInt);
      var randomMovie = movies[randomInt];
      movieTrailer(randomMovie.title, (err, url) =>{
        console.log('Requesting trailer: ', randomMovie.title);
        if(err) throw err;
        var embedUrl = url.replace('watch?v=','embed/');
        console.log('Video ID: ', url.slice(32,url.length));
        randomMovie.trailerURL = embedUrl; //Add the embed URL to the randomMovie object before rendering it
        res.render('main',randomMovie,
        (err, html) =>
        {
          if(err) throw err;
          console.log('Rendering...');
          res.send(html);
          console.log("Done!");
        });
      });
    });

});

module.exports = router;

app.js

const express = require('express');

//Define app and settings
const app = express();
const exphbs = require('express-handlebars');
var cookieParser = require('cookie-parser');
const port = 3000;

var routes = require('./routes');

var debug = true;

app.use('/', routes);
app.use(express.static('public'));
app.use(cookieParser());
//app.use(cookieParser());

//View engine
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');

app.listen(port, function () {
  console.log(`Server Starts on ${port}`);
  if(!debug) logs.disable(); //Disable logging if debug variable is false
});

【问题讨论】:

  • 正确的标题是req.headers.cookie

标签: javascript express cookies


【解决方案1】:

这发生在我身上,当时我从客户端(Angular)发送了一个 PUT 请求而没有传递 body 对象。

我正在这样做(缺少第二个参数):

requestBranchEditPermission() {
  return this.http.put<IPutProfile>(`${this.api}/some-endpoint`, this.options).toPromise();
}

而不是这个:

requestBranchEditPermission() {
  return this.http.put<IPutProfile>(`${this.api}/some-endpoint`, {}, this.options).toPromise();
}

【讨论】:

  • 你是我的救星!谢谢!我遇到了post 请求(角度客户端)的问题
  • "没有传递 body 对象。",这是不相关且具有误导性的。 put 的第三个参数是标题。您将标头信息作为请求正文传递。
【解决方案2】:

这解决了我的问题:

基本上,当您从客户端向服务器发送请求时,请确保添加withCredentials: true。例如

{
    headers: new HttpHeaders({
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }),
    'withCredentials':true
  };

【讨论】:

  • 值得注意的是,如果没有“withCredentials”:true 将不会发送任何 cookie
【解决方案3】:

您需要将 cookie 读取为 req.cookies['cookie-name'] 并将 cookie 设置为 resInit.cookie('cookie-name', 'cookie-value')

【讨论】:

    【解决方案4】:

    您要检查req.headers.cookie,这将由 express 设置。

    或者,如果您想使用存储在req.cookies 中的cookie-parse 中间件的解析结果,那么您的问题是您注册路由和中间件的顺序。

    app.use('/', routes);
    app.use(express.static('public'));
    app.use(cookieParser());
    

    cookie的解析是在routes中的路由执行后完成的。

    您需要将cookieParser()移动到您要使用的路线之前。

    app.use(cookieParser());
    app.use('/', routes);
    app.use(express.static('public'));
    

    【讨论】:

    • 就是这样!谢谢你。在路线之前更改了cookieParser(),它可以工作!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2016-02-23
    • 2021-12-25
    • 2011-12-20
    • 2015-06-26
    • 2016-05-12
    相关资源
    最近更新 更多