You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vercel部署的MERN项目:Passport认证致Axios请求500错误

MERN项目Vercel部署后Passport认证状态丢失引发500错误

问题概况

在Vercel部署的拆分客户端与服务端的MERN项目,两者均部署成功且可访问,但本地正常运行的服务端Axios方法在部署后失效:

  • 仅首页hero接口能正常从数据库获取6张图片并渲染
  • 进入其他路由时,浏览器控制台抛出500错误,Axios标记错误类型为BAD_RESPONSE而非BAD_REQUEST

错误场景与代码示例

场景1:获取用户列表接口(POST请求)

前端Axios代码

useEffect(()=>{
    async function getList(){
      try{
        const response = await axios.post("https://pelis-mern-server-five.vercel.app/lists/get-my-list", {id:user._id, profId:profileId}, {withCredentials:true, headers:{"Content-Type":"application/json"}})
        console.log(response)
        if(response.data.list.length > 0){
          console.log("hay")
          setList(response.data.list)
        }
      }catch(err){console.log(err.stack)}
    }
    getList()
},[])

服务端对应控制器(路由/lists/get-my-list)

const get_my_list = async (req,res) => {
    console.log("req.user", req.user)
    const {id, profId} = req.body
    const user = await User.findById(id)
    const index = user.profiles.findIndex(prof => prof._id == profId)
    const list = user.profiles[index].myList
    res.json({list:list})
}

场景2:获取用户所有配置文件接口(GET请求)

前端Axios代码

useEffect(()=>{
        async function obtainProfiles(){
            try{
                const data = await axios.get("https://pelis-mern-server-five.vercel.app/profiles",{withCredentials:true})
                console.log(data.data)
                setProfiles(data.data)
            }catch(err){
                console.log(err.stack)
            }
        }
        obtainProfiles()
},[])

服务端对应控制器(路由/profiles)

const get_all_profiles = async (req,res) => {
  console.log("req.user", req.user)
  let call = await User.findById({_id:req.user.id})
  let profiles = call.profiles
  res.json(profiles)
}

错误日志详情

浏览器控制台错误

AxiosError: Request failed with status code 500
    at settle.js:19:12
    at XMLHttpRequest.f (xhr.js:111:7)

服务端部署日志错误

req.user undefined //user object console log

Unhandled Promise Rejection 
{"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"TypeError: Cannot read properties of undefined (reading 'id')",
"reason":{"errorType":"TypeError",
"errorMessage":"Cannot read properties of undefined (reading 'id')",
"stack":["TypeError: Cannot read properties of undefined (reading 'id')"," at get_all_profiles 
(/var/task/server/controllers/userControllers.js:68:48)","    at Layer.handle [as handle_request] 
(/var/task/server/node_modules/express/lib/router/layer.js:95:5)","    at next 
(/var/task/server/node_modules/express/lib/router/route.js:144:13)","    at Route.dispatch 
(/var/task/server/node_modules/express/lib/router/route.js:114:3)","    at Layer.handle [as handle_request] 
(/var/task/server/node_modules/express/lib/router/layer.js:95:5)","    at /var/task/server/node_modules/express/lib/router/index.js:284:15","    at Function.process_params 
(/var/task/server/node_modules/express/lib/router/index.js:346:12)","    at next 
(/var/task/server/node_modules/express/lib/router/index.js:280:10)","    at Function.handle 
(/var/task/server/node_modules/express/lib/router/index.js:175:3)","    at router 
(/var/task/server/node_modules/express/lib/router/index.js:47:12)"]},"promise":{},"stack":
["Runtime.UnhandledPromiseRejection: TypeError: Cannot read properties of undefined (reading 'id')","    at process.<anonymous> (file:///var/runtime/index.mjs:1276:17)","   
at process.emit (node:events:529:35)","    
at emit (node:internal/process/promises:149:20)","   
at processPromiseRejections (node:internal/process/promises:283:27)","    
at process.processTicksAndRejections (node:internal/process/task_queues:96:32)"]}

Unknown application error occurred

Runtime.Unknown

核心疑问

核心问题与Passport认证的用户状态有关:登录时/signin路由日志显示用户已认证并输出对象,但跳转到仪表盘后req.user变为未定义,认证状态丢失。为何该问题仅出现在Vercel部署环境,本地运行却完全正常?

Passport相关代码

Passport策略代码

const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const User = require('../models/User')
const bcrypt=require('bcrypt')

module.exports.start = async(passport)=>{
  passport.use(new LocalStrategy({
    usernameField: 'email', 
    passwordField: 'password', 
  },
  async (email, password, done) => {

      try {
        const user = await User.findOne({ email });
        if (!user) {
          return done(null, false, { message: 'User not found' });
        }
         const isPasswordValid = await bcrypt.compare(password, user.password);
        
        if (!isPasswordValid) {
          return done(null, false, { message: 'Contraseña incorrecta' });
        }else{
          //console.log(user)
           return done(null, user);
        }
  
      } catch (error) {
        return done(error);
      }
    }
  ));
  
  passport.serializeUser((user, done) => {
    console.log("serialized", user)
    done(null, user._id);
  });
  
  passport.deserializeUser(async (id, done) => {
    console.log("deserialized")
    console.log(id)
    try {
      const user = await User.findById({_id : id});
      done(null, user);
    } catch (error) {
      done(error);
    }
  })
}

index.js中Passport调用代码

const passport = require('passport')
const local = require('./config/passport')
const flash = require('connect-flash')

local.start(passport)
app.use(passport.initialize())
app.use(passport.session())
app.use(flash())

内容的提问来源于stack exchange,提问作者VPAR261

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:35:17