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

在Netlify部署Gatsby WordPress站点失败,search页location.state未定义报错

报错根因

这个报错出现在Gatsby静态HTML构建阶段,核心原因是:/search/ 页面代码直接对location.state做结构赋值,但Gatsby构建时执行的是服务端预渲染逻辑,此时不存在前端路由跳转带来的location.state参数,该值为undefined,直接解构就会抛出类型错误,导致构建中断。

修复方案
  • 方案1:为location.state添加兜底默认值(最便捷,无需修改路由规则)
    直接修改src/pages/search.js第10行代码,添加默认值兜底:
// 原代码
// const { userQuery, searchQuery } = location.state
// 修改后
const { userQuery, searchQuery } = location.state || {}
// 若需要属性默认值可以写成
// const { userQuery = '', searchQuery = '' } = location.state || {}

如果业务逻辑要求必须有这两个参数才能展示搜索页,可以额外加判断逻辑,无参数时跳转回首页或者展示空状态:

useEffect(() => {
  if (!userQuery) {
    window.location.href = '/'
  }
}, [userQuery])
  • 方案2:将搜索页设为客户端专属路由(适合不需要预渲染的动态页面)
    如果搜索页本身不需要被搜索引擎爬虫抓取,不需要生成静态HTML,可以在项目根目录的gatsby-node.js中添加如下配置,标记该页面为客户端渲染:
exports.onCreatePage = ({ page, actions }) => {
  const { createPage } = actions
  // 匹配搜索页路径
  if (page.path === '/search/') {
    // 标记为客户端路由,构建时不生成静态HTML
    page.matchPath = '/search/*'
    createPage(page)
  }
}

修改后Gatsby构建阶段不会再预渲染该页面,只会在用户客户端访问时加载执行代码,此时location对象可以正常获取前端路由参数。

  • 方案3:添加运行环境判断
    也可以通过判断当前是否为浏览器环境,避免构建阶段执行需要客户端参数的代码:
const SearchPage = ({ location }) => {
  // 构建阶段返回加载占位
  if (typeof window === 'undefined') return <div>Loading...</div>

  // 浏览器环境才执行后续逻辑
  const { userQuery = '', searchQuery = '' } = location.state || {}
  // 剩余业务代码
}
验证方法

修改完成后本地执行npm run build命令,确认本地构建可以正常完成没有报错,再推送到Netlify触发部署即可。

内容的提问来源于stack exchange,提问作者Mugi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:45:07