[英]Express session not persisting after CORS calls in Angular-Node application
我正在嘗試創建一個基本的快速會話並將其保存到mongodb。 我陷入困境,因為會話不會通過CORS調用持續存在
我正在使用快速會話並使用'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等上檢查了類似的問題,但沒有人幫助過我。 任何幫助都會很棒。 謝謝
找到了答案。 對於我通過HttpClient進行的每個服務器請求,我需要將withCredentials選項設置為true。 像這樣:
this.http.get<{message: string, orders: any}>
('http://localhost:3000/orders/get', {withCredentials: true});
我想我只需找到一種方法來全局設置此選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.