Nuxt3中出现Cannot stringify arbitrary non-POJOs错误,附相关业务代码
解决Nuxt3「Cannot stringify arbitrary non-POJOs」错误
错误本质
这个报错是因为Nuxt在序列化应用状态(比如服务端渲染后向客户端传递状态)时,遇到了无法被JSON.stringify处理的非普通JavaScript对象(例如Promise、类实例、带复杂原型链的对象)。结合你的代码,问题大概率出在useAuth返回的状态包含非POJO对象,或是useFetch的响应数据处理不当。
排查修复步骤
1. 规范useAuth的类型与状态
你用as any断言useAuth的返回值会隐藏类型问题,先明确status为普通字符串类型:
// 替换原有调用,明确状态的合法取值 const { status } = useAuth() as { status: Ref<'authenticated' | 'unauthenticated' | 'loading'> }
如果useAuth是Pinia store,检查store内的status是否初始化为纯字符串,而非包含复杂对象的结构。
2. 替换路由守卫中的useFetch
useFetch返回的data是Ref包装对象,且可能附带响应元数据(如headers、config),这些非POJO属性会触发序列化错误。改用$fetch直接获取纯JSON数据:
if (status.value === 'authenticated') { // 直接请求获取纯JSON响应 const rawData = await $fetch('/api/profile/getUserOnly') // 仅提取需要的字段,避免携带非POJO属性 const contact = rawData?.contact if ((contact == null || contact === '') && to.path !== '/profile/need-info') { return navigateTo('/profile/need-info') } }
3. 检查API接口返回数据
确保/api/profile/getUserOnly接口返回纯JSON对象,不包含函数、Symbol或其他无法序列化的类型。如果接口返回自定义类实例,需在API层先转换为普通对象。
4. 路由守卫返回值校验
如果代码写在defineNuxtRouteMiddleware中,注意:
- 用
async/await正确处理所有异步逻辑,避免遗留未处理的Promise - 返回
navigateTo时,不要附带任何非POJO对象
验证修复
修改后重启Nuxt服务,触发身份验证跳转逻辑,检查报错是否消失。若问题依旧,可尝试:
- 删除
.nuxt文件夹和node_modules/.cache清除缓存 - 检查全局状态管理(如Pinia)中是否存在其他非POJO对象
内容的提问来源于stack exchange,提问作者Suliaman A. Barry
相关产品推荐
相关产品推荐

