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

Next.js中useContext传入getServerSideProps报错:Cannot read properties of null

问题根源与解决方案

核心错误原因

getServerSideProps 是服务器端执行的函数,而 useContext 是React客户端Hook,仅能在React组件的渲染周期内使用。两者运行环境完全隔离,直接在getServerSideProps中调用useContext必然触发错误——服务器端不存在React上下文,所以会出现Cannot read properties of null (reading 'useContext')。

正确实现思路

要将客户端输入的搜索关键词传递给服务器端的API调用,需通过URL查询参数完成,而非Context。具体步骤如下:


1. 修改SearchLine.tsx:跳转时携带搜索参数

将原来通过Context存储关键词的逻辑,改为跳转至/search-results时,把关键词拼接到URL的query参数中:

import { useState } from 'react';
import { useRouter } from 'next/router';

const SearchLine = () => {
  const [inputVal, setInputVal] = useState('');
  const router = useRouter();

  const handleSubmit = () => {
    if (!inputVal.trim()) return;
    // 编码关键词后拼接至URL
    router.push(`/search-results?searchWord=${encodeURIComponent(inputVal)}`);
  };

  return (
    <div className="search-line">
      <input
        type="text"
        value={inputVal}
        onChange={(e) => setInputVal(e.target.value)}
        placeholder="输入关键词搜索"
      />
      <button onClick={handleSubmit}>搜索</button>
    </div>
  );
};

export default SearchLine;

2. 修改/search-results页面:从query参数获取关键词并调用API

在getServerSideProps中直接从context.query提取关键词,再执行API调用:

export async function getServerSideProps(context) {
  // 从URL query中获取搜索关键词
  const { searchWord } = context.query;

  // 无关键词时重定向至首页
  if (!searchWord) {
    return {
      redirect: { destination: '/', permanent: false },
    };
  }

  // 调用API,传入编码后的关键词
  const apiRes = await fetch(
    `https://your-api-domain.com/search?keyword=${encodeURIComponent(searchWord)}`
  );
  const searchData = await apiRes.json();

  return { props: { searchData } };
}

const SearchResults = ({ searchData }) => {
  return (
    <div className="search-results">
      <h2>搜索结果(共{searchData.length}条)</h2>
      <ul>
        {searchData.map(item => (
          <li key={item.id}>{item.title}</li>
        ))}
      </ul>
    </div>
  );
};

export default SearchResults;

3. 检查_app.tsx的Provider配置(若仍需客户端使用Context)

如果只是服务器端调用API不需要Context,但客户端仍需使用searchWord,确保Provider正确包裹整个应用即可:

import { SearchProvider } from '../contexts/SearchContext';
import '../styles/globals.css';

function MyApp({ Component, pageProps }) {
  return (
    <SearchProvider>
      <Component {...pageProps} />
    </SearchProvider>
  );
}

export default MyApp;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:50:27