我有一个使用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: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'})});
˚
答案 0 :(得分:0)
在拦截器中,代码应为 req.clone({withCredentials:true});
出于某些原因,headers.set不起作用