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
相关产品推荐
相关产品推荐

