【问题标题】:Express-sessions creating new session on every request快速会话在每个请求上创建新会话
【发布时间】:2020-07-13 17:52:19
【问题描述】:

我有一个使用快速会话的快速后端。我有一个未连接到后端的角度前端。每次我的前端发出请求时,express-sessions 都会创建一个新会话。我不知道为什么。我认为问题可能是角度不发送cookie。我在 chrome 网络选项卡的 req 标头中看不到任何 cookie。我不知道为什么 Angular 会这样做,或者它是否是问题所在。任何帮助将不胜感激!以下是所有相关代码

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import {NgbModule} from '@ng-bootstrap/ng-bootstrap';
import {HttpClientModule, HTTP_INTERCEPTORS} from '@angular/common/http';
import {FormsModule} from '@angular/forms';
import { NavbarComponent } from './navbar/navbar.component';
import { SignUpComponent } from './sign-up/sign-up.component';
import { LogInComponent } from './log-in/log-in.component';
import { WithCredentialsInterceptorService } from './with-credentials-interceptor.service';



@NgModule({
  declarations: [
    AppComponent,
    NavbarComponent,
    SignUpComponent,
    LogInComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    NgbModule,
    FormsModule,
    HttpClientModule
  ],
  providers: [{provide : HTTP_INTERCEPTORS, useClass : WithCredentialsInterceptorService, 
multi : true}],
  bootstrap: [AppComponent]
})
export class AppModule { }

角度拦截器

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';

@Injectable()
export class WithCredentialsInterceptorService implements HttpInterceptor{

  intercept(req : HttpRequest<any>, next : HttpHandler){
    let modifiedReq = req.clone({headers : req.headers.set('withCredentials', 'true')});
    console.log(req.headers.get('cookie'));
    return next.handle(modifiedReq);
  }

  constructor() { }
}

app.js

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cors = require('cors');
const corsOptions = {
    credentials : true
};
const session = require('express-session');
const mongoDbStore = require('connect-mongodb-session')(session);
const store = new mongoDbStore({
    uri : 'mongodb+srv://Shlomo:Shizam11192@cluster0-32bfg.mongodb.net/test?retryWrites=true&w=majority',
    databaseName : 'test',
    collection : 'sessions'
},error=>{
    if(error){
        console.log(error);
    }
});

const authRoutes = require('./routes/authRoutes');

app.options('*', cors(corsOptions));
app.use(cors(corsOptions));
app.use(bodyParser.json());
app.use(session({
    secret : 'You are doing great Shlo!!!',
    resave : false,
    saveUninitialized : true,
    cookie : {
        maxAge : 3600000,
        secure : false,
        httpOnly : false
    }
}));
app.use(authRoutes);





 mongoose.connect('mongodb+srv://@cluster0-32bfg.mongodb.net/test? 
   retryWrites=true&w=majority')
        .then(()=>{console.log('mongoose connected!')});
        app.listen(process.env.PORT || 3000, ()=>{
            console.log('Listening!!! Keep it up Shlo!!!');
        });

认证路线

router.get('/', (req,res,next) =>{console.log(req.session.id);res.json({message : 
'whatever'})});

°

【问题讨论】:

    标签: node.js angular express express-session


    【解决方案1】:

    在拦截器中的代码应该是 req.clone({withCredentials : true});

    由于某种原因,headers.set 不起作用

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2012-08-30
      • 2021-04-21
      • 2021-08-19
      • 2015-07-25
      • 2022-08-06
      相关资源
      最近更新 更多