Nuxt SSR数据:稳定键、序列化与保密边界
本篇分析同一份本地课程目录。示例未执行,未安装、启动或调用接口;手写契约只是设计输入。理解首屏模型后,再用完整项目逐项检查数据路径。
Nuxt为什么用useFetch而不在setup直接调用$fetch
Nuxt为什么用useFetch而不在setup直接调用
useAsyncData适合包住自己的异步函数,详情用它调用requestFetch并返回公开课程对象。handler只读取,没有写入、计数或随机状态;必须返回有意义的数据,不能用undefined/null模糊成功与失败。useAsyncData并不是一个通用后端缓存。依据:Nuxt数据获取、useAsyncData。
Nuxt的数据键为什么必须包含筛选和路由参数
Nuxt的数据键为什么必须包含筛选和路由参数?数据键标识异步结果,筛选与路由参数改变资源含义,不能仍用一个course键表示所有详情。本例列表键编码规范化后的[q,level],详情键包含id;相同输入在服务器与浏览器生成相同字符串,避免把随机数或当前时间写进键。JSON数组编码避免简单拼接时分隔符碰撞。
q/level由URL计算,输入草稿只有提交后才改变URL;返回与前进能恢复筛选。详情definePageMeta以route.path为页面key,路径切换重新建立setup和错误边界,异步数据键仍明确区分资源。若移除页面重建以复用组件,还要处理异步error变化与草稿生命周期;仅让mounted再读一次不可行。共享同一数据键的调用应保持handler与关键选项一致,别把列表和详情写成同一缓存槽。依据:useFetch。
Nuxt服务端请求怎样安全转发请求上下文
Nuxt服务端请求怎样安全转发请求上下文?相对地址useFetch在SSR中使用当前请求上下文,useRequestFetch适合显式携带同一上下文的内部读取;它们不同于任意外部URL代理。本例welcome只把Accept-Language归一化成en/zh,不回显原始头、不建立身份。课程详情虽然使用requestFetch,也只访问应用构造的/api/courses/加编码slug。
不要接受query.url然后把cookie或authorization整包转发给用户选择的主机。接入外部服务时应固定允许的目标、路径与最少头字段,设置超时和响应限制,并另做权限校验。本例没有外部服务,所以没有代理凭据,也没有用演示header假装登录。前端截断q只是交互策略;API独立拒绝重复query、非法level和过长q。依据:useRequestFetch。
Nuxt的payload为什么不能放服务端秘密
Nuxt的payload为什么不能放服务端秘密?payload要交给浏览器恢复页面,服务端执行的函数返回值也可能被序列化。秘密应该留在server路由与runtimeConfig非public字段中;只要把它返回给useFetch、useAsyncData或useState,就跨过保密边界。本例只输出课程DTO、归一化语言和布尔偏好,public配置仅有目录标题。
不要返回整个config、数据库实体、请求对象或异常堆栈。序列化支持的值也不等于适合公开:函数、连接和循环对象更不应当成为页面数据;本例主动使用普通字符串、数组、对象和布尔值,JSON契约和Nuxt内部payload格式不是同一协议。Nuxt处理自己的payload编码,开发者不手工拼接script并插入JSON。未来server-only模块也不能被客户端组件导入。依据:运行时配置。
练习:三种缓存槽
比较catalog:detail:vue-basics、catalog:list:["Vue","all"]和catalog:welcome:v1:哪些可以共享为公共业务缓存,哪些即使键稳定也不能按URL跨请求复用?若接口返回对象增加secret字段,页面模板没有引用它是否安全?
参考答案(推演,未执行)
两个课程结果来自公开fixture,未来可在明确失效规则后设计公共缓存;本例仍全部no-store。welcome依赖请求语言,稳定键只用于本次Nuxt上下文的数据身份,不授权进程/CDN共享。未被模板引用的secret仍可能在payload和网络响应中出现,必须从API输出DTO删除,不能靠界面隐藏保密。
继续阅读
- 排错
- 开发实践
- 开发实践