无法在React组件外获取Redux store值,报EISDIR目录非法操作错误
问题根因与解决方案
1. 报错EISDIR: illegal operation on a directory的核心原因
这个错误是打包工具(React Native的Metro、Webpack等)路径解析失败导致的:你导入路径指向的是一个目录,而不是可导入的JS/TS文件,且该目录下没有index.js等默认入口文件,或是你配置的路径别名存在映射错误。
2. 第一步:修正路径问题
优先排查你的导入路径配置:
- 检查别名配置(
babel-plugin-module-resolver或tsconfig的paths配置)中@是否正确映射到了项目源码根目录(通常是src目录) - 确认你的Redux相关文件结构:是否存在
redux/store.js文件,而非一个名为store的目录;如果是store/index.js的目录结构,确认导入路径无拼写错误 - 可以先把别名导入换成相对路径测试,比如
import { store } from '../redux/store',如果相对路径不报错,直接修正别名配置即可解决EISDIR报错。
3. 第二步:修正Store导出与调用逻辑
你当前的Store调用存在两个隐藏问题:
- 每次调用
configureStore()虽然不会重复创建实例,但直接在模块顶层读取token,只会在模块初始化时读一次,后续token更新后不会同步到请求里 - Redux Persist的本地数据恢复是异步操作,模块初始化阶段读取的token大概率是初始空值,不是本地持久化存储的有效token
调整Store配置文件,直接导出单例Store实例:
// 原有配置逻辑保持不变,修改导出逻辑 sagaMiddleware.run(sagas); // 直接导出单例store和persistor export const store = createStore(reducers, undefined, compose(...enhancers)); export const persistor = persistStore(store, persistConfig); // 保留原有configureStore兼容其他地方的调用 const configureStore = () => { return {persistor, store}; }; export default configureStore;
调整API文件的调用逻辑,每次发起请求时动态读取最新的token:
// General api to access data import ApiConstants from './ApiConstants'; // 直接导入单例store import { store } from '@/redux/store'; export default function api(path, params, method, token, contentType, extraHeaders) { // 每次请求时动态读取最新的token const { token: accessToken } = store.getState().authReducer; let options; if (contentType && contentType == 'multipart/form-data') { options = { headers: { Accept: 'application/json', 'Content-Type': 'multipart/form-data', device: 'mobile', Authorization: 'Bearer ' + accessToken, }, method: method, ...(params && {body: JSON.stringify(params)}), }; options.body = new FormData(); for (let key in params) { options.body.append(key, params[key]); } } else { options = { headers: { Accept: 'application/json', 'Content-Type': 'application/json', device: 'mobile', Authorization: 'Bearer ' + accessToken, ...extraHeaders, }, method: method, ...(params && {body: JSON.stringify(params)}), }; } if (__DEV__) { console.log('HERE IN API', ApiConstants.BASE_URL + path, options); } return fetch(ApiConstants.BASE_URL + path, options) .then(resp => resp.json()) .then(json => json) .catch(err => { if (__DEV__) { console.log('api error', err); } }); }
完成以上两步调整后,既可以解决EISDIR报错,也能保证每次请求都能拿到最新的有效token。
内容的提问来源于stack exchange,提问作者FortuneCookie
相关产品推荐
相关产品推荐

