【问题标题】:Express session not persisting after CORS calls in Angular-Node application在 Angular-Node 应用程序中调用 CORS 后,Express 会话不会持续存在
【发布时间】:2019-09-26 04:02:25
【问题描述】:

我正在尝试创建一个基本的快速会话并将其保存到 mongodb。 我被卡住了,因为会话不会通过 CORS 调用持续存在

我正在使用 express-sessions 执行此操作,并使用 'connect-mongodb-session' 将会话保存在 'mongodb' 中。

我已经进行了正确的配置,并且成功地创建了会话,将所需的变量保存在其中,并将会话保存在 Mongodb 中。

我的进口:

const session = require('express-session');
const MongoSessionStore = require('connect-mongodb-session')(session);

我的 CORS 配置

app.use((req, res, next)=>{
  // The below 2 headers are for cookies
  res.setHeader("Access-Control-Allow-Credentials", true);
  res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");
  res.setHeader("Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept");
  res.setHeader("Access-Control-Allow-Methods",
    "GET, POST, PUT, PATCH, DELETE, OPTIONS");
  next();
});

对于会话:

const store = new MongoSessionStore({
  uri: MONGO_URI,
  collection: 'sessions',
});

app.use(session({secret: 'secret', resave: false, saveUninitialized: false,
  store: store}));

这就是我在一次调用中保存会话中数据的方式:

router.get('/login', (req, res, next) => {
    req.session.isLoggedIn = true;
    req.session.user = result;
    req.session.save();
    console.log(req.sessionID);
    console.log(req.session);
....}

以上日志的结果:

Session {
  cookie:
  { path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true },
  isLoggedIn: true,
  user: { _id: '1.6419261913557492',
    name: 'Vegeta',
    email: 'veg@gmail.com',
    password: 'galick',
    cart: { items: [] },
    __v: 0 } }

YCinv0rm8MOFplCHyc5l1z9wtXKVJKTR

现在,在另一个电话中:

router.put('/cart/add/:_id', (req, res, next) => {
  console.log(req.sessionID);
  console.log(req.session);
  ...}

结果:

oL2C7j5HYLF-GJx4bzOl_1_84homq7Lx

Session {
  cookie:
  { path: '/',
    _expires: null,
    originalMaxAge: null,
    httpOnly: true } }
TypeError: Cannot read property 'cart' of undefined
    at router.put (d:\MEAN\shopping\backend\routes\shop-router.js:38:42)
    at Layer.handle [as handle_request] (d:\MEAN\shopping\node_modules\express\lib\router\layer.js:95:5)
    at next (d:\MEAN\shopping\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (d:\MEAN\shopping\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (d:\MEAN\shopping\node_modules\express\lib\router\layer.js:95:5)
    at d:\MEAN\shopping\node_modules\express\lib\router\index.js:281:22
    at param (d:\MEAN\shopping\node_modules\express\lib\router\index.js:354:14)
    at param (d:\MEAN\shopping\node_modules\express\lib\router\index.js:365:14)
    at Function.process_params (d:\MEAN\shopping\node_modules\express\lib\router\index.js:410:3)
    at next (d:\MEAN\shopping\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (d:\MEAN\shopping\node_modules\express\lib\router\index.js:174:3)
    at router (d:\MEAN\shopping\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (d:\MEAN\shopping\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (d:\MEAN\shopping\node_modules\express\lib\router\index.js:317:13)
    at d:\MEAN\shopping\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (d:\MEAN\shopping\node_modules\express\lib\router\index.js:335:12)

我不知道我做错了什么。我已经检查过关于 stackoverflow、github 等的类似问题,但没有一个对我有帮助。任何帮助都会很棒。 谢谢

【问题讨论】:

    标签: node.js angularjs express cors express-session


    【解决方案1】:

    找到了答案。似乎对于我通过 HttpClient 发出的每个服务器请求,我都需要将 withCredentials 选项设置为 true。 像这样:

    this.http.get<{message: string, orders: any}>
    ('http://localhost:3000/orders/get', {withCredentials: true});
    

    我想我只需要找到一种方法来全局设置此选项。

    【讨论】:

    • 谢谢,请确保您在后端使用了设置为 true 的 cors 凭据。 app.use(cors({credentials: true, origin: 'http://localhost:4200'}));。我浪费了几个小时来清除这个错误。
    猜你喜欢
    • 2019-05-25
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2020-12-14
    • 2013-10-21
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多