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

页面生成时出现TypeError: undefined is not iterable错误求助

错误原因分析

出现TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))的核心原因:你创建的AuthContext未设置默认值,当组件在AuthProvider范围外调用useContext(AuthContext)时会拿到undefined,而你在消费Context时大概率用了数组解构(比如const [auth, setAuth] = useContext(AuthContext)),对undefined执行数组解构就会触发这个迭代错误。

修复方案

1. 给AuthContext添加匹配格式的默认值

修改Context创建代码,传入和Provider的value一致格式的默认值(数组:包含初始auth状态和空函数):

const AuthContext = createContext([
  { user: null, token: "" }, 
  () => {} // 空的setAuth默认函数,避免解构报错
]);

2. 修正axios配置的执行时机(额外优化)

你当前把axios配置放在组件顶层,每次组件渲染都会重复执行,应该放到useEffect中,并监听auth.token的变化,确保token更新时axios请求头同步更新:

useEffect(() => {
  // 配置axios基础地址和请求头
  const baseURL = process.server ? process.env.API : process.env.NEXT_PUBLIC_API;
  axios.defaults.baseURL = baseURL;
  axios.defaults.headers.common["Authorization"] = `Bearer ${auth?.token}`;

  // 仅在客户端读取localStorage(服务器端无localStorage API)
  if (!process.server && localStorage.getItem("auth")) {
    setAuth(JSON.parse(localStorage.getItem("auth")));
  }
}, [auth.token]); // 监听token变化,自动更新请求头

完整修复后的代码

import { useState, useEffect, createContext } from "react";
import axios from "axios";

// 添加默认值,匹配Provider的value格式
const AuthContext = createContext([
  { user: null, token: "" },
  () => {}
]);

const AuthProvider = ({ children }) => {
  const [auth, setAuth] = useState({
    user: null,
    token: "",
  });

  useEffect(() => {
    // 配置axios
    const baseURL = process.server ? process.env.API : process.env.NEXT_PUBLIC_API;
    axios.defaults.baseURL = baseURL;
    axios.defaults.headers.common["Authorization"] = `Bearer ${auth?.token}`;

    // 客户端初始化auth状态
    if (!process.server && localStorage.getItem("auth")) {
      setAuth(JSON.parse(localStorage.getItem("auth")));
    }
  }, [auth.token]);

  return (
    <AuthContext.Provider value={[auth, setAuth]}>
      {children}
    </AuthContext.Provider>
  );
};

export { AuthContext, AuthProvider };
额外注意事项
  • 确保所有使用AuthContext的组件都包裹在AuthProvider内部,这是Context使用的最佳实践,避免拿到无意义的默认状态。
  • 服务器端渲染时必须避开localStorage,因为服务器环境不存在该API,否则会触发新的报错。

内容的提问来源于stack exchange,提问作者kartik Krishna sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:27