簡體   English   中英

req.cookies 返回未定義但 cookies 已設置

[英]req.cookies returns undefined but cookies are set

我在我的 express 應用程序中使用cookie-parser 當請求根頁面時,我使用res.cookie(name, value)在 cookie 上設置了一個隨機數,它設置得很好(我在瀏覽器控制台上檢查過)。 但是當我嘗試記錄req.cookie時,它總是返回 undefined。

這是我的代碼:

路由.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;

應用程序.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
});

您要么想檢查由 express 設置的req.headers.cookie

或者,如果您想使用存儲在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'));

這解決了我的問題:

基本上,當您從客戶端向服務器發送請求時,請確保添加withCredentials: true 例如

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

您需要將 cookie 讀取為req.cookies['cookie-name']並將 cookie 設置為resInit.cookie('cookie-name', 'cookie-value')

這發生在我身上,當我從客戶端(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();
}

這對我有用

在前端添加credentials: 'include'作為您獲取 API 的選項

下面是獲取請求的更詳細的代碼

fetch('url', {credentials: 'include'})
.then(res => res.json())
.then(data => //do something with the data)
.catch(err => console.log(err.message));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM