node 使用session 获取数据undefined的问题

博客围绕设置和获取验证码时session问题展开。发现首个session有code,后续没有,经排查可能是跨域未携带cookie,前端添加withCredentials后仍未解决,最终确定是跨域问题,还提及vue.config.js和axios相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置验证码和获取验证码
phoneCode.get('/code', (req, res) => {
  req.session.code = "1234"
  console.log(req.session);
  successSend(res, {}, "发送成功")
})
log.post('/register', (req, res) => {
  const body = req.body
  const account = body.account || ""
  const password = body.password || ""
  const mobile = body.mobile || ""
  const code = body.code || ""
  const set_Mobile = req.session.regMobile || ""
  if (set_Mobile) {
    if (m.checkEmpty(res, account, password)) return
    db.user.create({
      account: account,
      password: password,
      mobile: set_Mobile,
      nickname: m.getNickName()
    })
  } else {
    if (m.checkEmpty(res, account, password, mobile, code)) return
    console.log(req.session);
结果是输出:
Session {
  cookie: {
    path: '/',
    _expires: 2021-01-12T08:24:18.081Z,
    originalMaxAge: 660000,
    httpOnly: true
  },
  code: '1234'
}
Session {
  cookie: {
    path: '/',
    _expires: 2021-01-12T08:24:24.499Z,
    originalMaxAge: 660000,
    httpOnly: true
  }
}
可以看到第一个session有code,第二个就没有
然后去查了,说可能是跨域没有携带cookie的问题,于是前端又在请求时加上了 withCredentials,请求头也有withCredentials: true
request.headers['withCredentials'] = true
然后session还是没有code的值
node的请求头设置
  res.header('Access-Control-Allow-Origin', req.headers.origin)
  //res.header("Access-Control-Allow-Headers", "content-type");
  res.header("X-Powered-By", ' 3.2.1');
  res.header('Access-Control-Allow-Headers', '*');
  res.header('Access-Control-Allow-Methods', 'get,post')
  res.header('Access-Control-Allow-Credentials', true)
  res.setHeader('Content-Type', 'application/json');
前端跨域
module.exports = {
  devServer: {
    proxy: {
      '/api': { // 路径中有 /api 的请求都会走这个代理 , 可以自己定义一个,下面移除即可
        target: 'http://localhost:3000/', // 目标代理接口地址,实际跨域要访问的接口,这个地址会替换掉 axios.defaults.baseURL
        secure: false,
        changeOrigin: true, // 开启代理,在本地创建一个虚拟服务端
        ws: true, // 是否启用  websockets;
        pathRewrite: { // 去掉 路径中的  /api  的这一截
          '^/api': ''
        }
      },
    },
  }
}
最后解决了,就是跨域问题
vue.config.js:
module.exports = {
  devServer: {
    host: 'localhost',
    port: 8080, // 端口号
    https: false, // https:{type:Boolean}
    hotOnly: true, // 热更新
    proxy: {
      // 配置多个跨域
      '/api': {
        target: 'http://localhost:3000', //跨域接口的地址
        changeOrigin: false,
        pathRewrite: {
          '^/api': ''
        }
      }
    },
    headers: {
      'Access-Control-Allow-Origin': '*',
    }
  }
}
axios
  private client = axios.create({
    baseURL: '/api',
    timeout: 100000,
  });
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值