nestjs中express-session中req.session.xx获取不到问题记录

问题描述

使用nestjs编写一个验证码登录接口,但是无法获取session中的验证码

前端

withCredentials:默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证明等)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据。
在使用axios的时候,需要加上withCredentials:true;否则cookie不正常发送

import axios from 'axios';
let instance=axios.create({
    timeout:5000,
    withCredentials:true
})
instance.interceptors.response.use(response=>{
    return response.data||response
})
export default instance;

后端

main.ts中配置如下

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as session from 'express-session';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(
    session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: false,//确保没有初始化的情况下不保存会话
      cookie: { secure: false },
    }),
  );
  await app.listen(3000);
}
bootstrap();

验证码和登录

确保在login前,先先调用了createCaptchaCode

export class loginController {
  constructor(private readonly xiaomanService: XiaomanService) {}
  @Get('code')
  createCaptchaCode(@Req() req,@Res() res){
    const captcha = svgCaptcha.create({
      size:4,
      fontSize:50,
      width:100,
      height:34,
      background:'#cc9966'
    })
    req.session.youcode=captcha.text;
    res.cookie('aa','bb')
    res.type('image/svg+xml');
    console.log(req.session.youcode)
    res.send(captcha.data);
  }
  @Post('login')
  login(@Req() req,@Body() body){
    console.log(req.session)
    if(req.session.youcode.toLocaleLowerCase()===body?.code.toLocaleLowerCase()){
      return {
        message:'登录成功'
      }
    }else{
      return {
        message:'登录失败'
      }
    }
  }
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Node.js服务器获取存在session的数据,你需要使用一个session middleware(会话间件)。最流行的是`express-session`间件。 以下是一个简单的示例代码,演示了如何使用`express-session`间件来设置和获取session数据: ```javascript const express = require('express'); const session = require('express-session'); const app = express(); // 设置session间件 app.use(session({ secret: 'mysecretkey', // 用于加密session ID的秘密密钥 resave: false, // 强制每次请求都重新保存session数据 saveUninitialized: true // 在session存储未初始化的数据 })); // 设置session数据 app.get('/setSessionData', (req, res) => { req.session.username = 'JohnDoe'; res.send('Session data saved successfully'); }); // 获取session数据 app.get('/getSessionData', (req, res) => { const username = req.session.username; res.send(`Session data: ${username}`); }); app.listen(3000, () => { console.log('Server started on port 3000'); }); ``` 在这个示例,我们使用`express-session`间件来设置和获取session数据。我们通过调用`req.session`属性来访问session对象并设置/获取数据。 当我们访问`/setSessionData`路由时,我们设置了一个名为`username`的session数据。然后,当我们访问`/getSessionData`路由时,我们从session获取该数据并将其发送回客户端。 请注意,为了使用`express-session`间件,我们需要先使用`npm install express-session`命令安装它。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值