Ziggy路由在Laravel Inertia SSR中出现读取未定义属性错误如何解决?
Laravel Inertia SSR 启动时出现
Cannot read properties of undefined (reading 'sounds.categories') 错误 运行php artisan inertia:start-ssr启动服务端渲染(SSR)时,控制台抛出如下错误:
TypeError: Cannot read properties of undefined (reading 'sounds.categories') at new N (file:///F:/Projects/laravel.site.ir/bootstrap/ssr/ssr.js:2102:25) at Proxy.T (file:///F:/Projects/laravel.site.ir/bootstrap/ssr/ssr.js:2203:14) at _sfc_ssrRender (file:///F:/Projects/laravel.site.ir/bootstrap/ssr/assets/Index-d177b86d.js:119:21) at renderComponentSubTree (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:695:9) at renderComponentVNode (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:641:12) at renderVNode (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:755:14) at renderComponentSubTree (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:710:7) at renderComponentVNode (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:641:12) at renderVNode (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:755:14) at renderComponentSubTree (F:\Projects\laravel.site.ir\node_modules\@vue\server-renderer\dist\server-renderer.cjs.js:710:7)
已知sounds.categories已正确定义,非SSR环境运行正常,使用ziggy-js作为路由插件,以下是可行的解决方案:
1. 确认服务端数据预加载逻辑
SSR渲染依赖服务端提前注入数据,需确保路由/控制器中已将sounds数据传递给Inertia页面:
// 示例控制器代码 return Inertia::render('Index', [ 'sounds' => [ 'categories' => SoundCategory::query()->get(), // 其他关联数据 ], ]);
检查返回的Inertia响应是否包含完整的sounds对象,避免客户端异步请求数据导致SSR渲染时数据缺失。
2. 修正组件数据获取方式
避免在组件中依赖客户端全局变量(如window)获取sounds数据,改用Inertia props传递:
<script setup> const props = defineProps({ sounds: { type: Object, required: true, }, }); </script> <template> <!-- 直接使用 props.sounds.categories --> <div v-for="category in props.sounds.categories" :key="category.id"> {{ category.name }} </div> </template>
3. 配置ziggy-js适配SSR环境
ziggy-js在SSR环境中需要全局初始化,修改ssr.js文件:
import { Ziggy } from './ziggy'; import { route } from 'ziggy-js'; // 为SSR全局挂载ziggy方法和配置 globalThis.route = route; globalThis.Ziggy = Ziggy;
同时运行php artisan ziggy:generate生成最新的路由配置文件,确保SSR构建时能获取正确的路由数据。
4. 添加数据兜底判断
在组件中对sounds及下属字段添加空值保护,避免SSR渲染时因数据未就绪报错:
<template> <div v-if="sounds?.categories"> <!-- 仅当数据存在时渲染内容 --> </div> </template>
或在props中设置默认值:
const props = defineProps({ sounds: { type: Object, required: false, default: () => ({ categories: [] }), }, });
5. 清理SSR构建缓存
删除bootstrap/ssr目录下的旧构建文件,重新执行:
npm run build php artisan inertia:start-ssr
确保使用最新的组件代码和数据逻辑进行SSR渲染。
内容的提问来源于stack exchange,提问作者MehranRJ
相关产品推荐
相关产品推荐

