Express-sessions在每个请求上创建新会话

问题描述 投票:0回答:1

我有一个使用express-session的express后端。我有一个没有连接到后端的有角度的前端。每当我的前端提出请求时,快速会话都会创建一个新会话。我不知道为什么。我认为问题可能出在不向回发送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:[email protected]/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个回答
0
投票

在拦截器中,代码应为req.clone({withCredentials:true});

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

© www.soinside.com 2019 - 2024. All rights reserved.