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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:10