迁移至NextJS后RTK-Query中间件已添加仍报错求助
下面是针对你在NextJS迁移中遇到的RTK-Query报错的几个常见原因和排查点:
Store实例未全局共享,重复创建
NextJS是服务端渲染框架,如果你在组件内部(比如组件顶层、useEffect里)每次渲染都新建store实例,会导致RTK-Query的middleware和reducer无法对应上。正确的做法是把store做成单例(比如在app/store.ts里导出唯一的store实例),或者用Redux Toolkit官方推荐的createWrapper工具来处理NextJS环境下的store初始化,保证服务端和客户端用的是同一个实例。reducerPath与rootReducer键名不匹配
检查你创建API实例时的reducerPath参数,确保它和rootReducer里添加的键名严格一致。报错提示的是reducerPath "api",那你要确认:创建API时是createApi({ reducerPath: 'api', ... }),而且rootReducer里确实写的是[API.reducerPath]: API.reducer,而不是硬编码的api: API.reducer(虽然看起来一样,但如果API实例的reducerPath被修改过就会出问题)。Middleware注入方式错误
在configureStore里配置middleware时,不要直接替换成仅包含API.middleware的数组,这样会丢掉Redux的默认middleware,也可能导致RTK-Query的middleware无法正常挂载。正确的写法应该是基于默认middleware去合并:configureStore({ reducer: rootReducer, middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(API.middleware), })确保
API.middleware被正确添加到middleware链中,没有被其他逻辑过滤掉。NextJS SSR/SSG环境的初始化问题
如果用的是NextJS App Router,要记住Redux store只能在客户端组件里使用,需要给相关组件加上'use client'指令。如果在服务端组件里尝试调用Redux相关逻辑,会导致服务端和客户端的store实例不一致,进而触发这个报错。要是用的是Page Router,一定要用createWrapper包裹_app.tsx,保证服务端渲染时store的一致性。冗余代码引发的冲突
你提到还有冗余代码没清理,有可能存在多个API实例或者旧的store配置没完全移除。比如旧代码里创建了另一个createApi实例,但没配置对应的middleware,或者有多个configureStore的调用,导致某个未正确配置的实例抛出了报错。可以全局搜一下createApi和configureStore,看看有没有多余的调用。
内容的提问来源于stack exchange,提问作者Steven Matthews

