Adonis Inertia配置中共享User无法传入Vue Props问题排查
默认情况下,Adonis Inertia.js配置文件包含以下代码段:
sharedData: { user: (ctx) => ctx.inertia.always(() => ctx.auth.user), },
但在Vue组件中通过defineProps获取user时,值为undefined。
我使用Ally完成微软账号认证,登录流程会创建用户,对应控制器代码如下:
import type { HttpContext } from '@adonisjs/core/http' import User from '#models/user' export default class MicrosoftLoginsController { public async redirect({ally}: HttpContext) { return ally.use('microsoft').redirect() } public async handleCallback ({ally, auth, response}: HttpContext) { const ms = ally.use('microsoft') if (ms.accessDenied()) { return 'You have cancelled the login process' } if (ms.stateMisMatch()) { return 'We are unable to verify the request. Please try again' } if (ms.hasError()) { return ms.getError() } const user = await ms.user() const findUser = { email: user.original.mail } const userDetails = { fullName: user.original.displayName, email: user.original.mail, providerId: user.original.id, provider: 'microsoft' } const newUser = await User.firstOrCreate(findUser, userDetails) await auth.use('web').login(newUser) return response.redirect('/') } }
我遗漏了什么配置?AdonisJS官方文档对此说明不够详细。
对齐认证守卫:
控制器中用auth.use('web')完成登录,但Inertia配置里的ctx.auth.user默认调用的是默认守卫。检查config/auth.ts的default.guard是否为web,如果不是,需要在Inertia配置中明确指定守卫:user: (ctx) => ctx.inertia.always(() => ctx.auth.use('web').user),调整中间件执行顺序:
确保Inertia中间件(@adonisjs/inertia/inertia_middleware)在认证中间件之后执行。在start/kernel.ts的server.middleware数组中,把认证中间件放在Inertia中间件前面,这样共享数据时ctx.auth.user才能被正确获取。验证首页路由的渲染方式:
登录后重定向的/路由,必须是通过inertia.render渲染的Inertia页面,而非普通视图渲染。只有Inertia渲染的页面才会自动注入共享数据,否则前端无法获取到user。检查User模型序列化规则:
如果User模型有隐藏字段或未配置序列化,会导致ctx.auth.user的数据无法正确传递到前端。可以在User模型中添加serialize()方法,明确指定需要传递的字段:import { DateTime } from 'luxon' import { BaseModel, column } from '@adonisjs/core/orm' export default class User extends BaseModel { @column({ isPrimary: true }) public id: number @column() public fullName: string @column() public email: string // 其他字段... public serialize() { return { id: this.id, fullName: this.fullName, email: this.email, // 添加需要暴露给前端的字段 } } }调试共享数据生成过程:
在Inertia配置的user回调中添加日志,确认ctx.auth.user是否存在:user: (ctx) => { console.log('当前认证用户:', ctx.auth.user) return ctx.inertia.always(() => ctx.auth.user) },启动服务后查看控制台输出,判断是Auth未获取到用户,还是Inertia共享数据环节出了问题。
内容的提问来源于stack exchange,提问作者RyanJMP

