Expo项目导入TinyDB遇fs问题,求教react-native-fs用法
Expo 环境下替代 TinyDB 的解决方案
问题根源
TinyDB 依赖 Node.js 原生 fs 模块,但 Expo 不支持 Node 原生文件系统 API,直接调用会触发权限或兼容性报错。你需要改用 Expo 适配的存储方案,或调整 react-native-fs 的用法适配 Expo 环境。
方案一:使用 Expo 官方推荐的 expo-file-system
这是最适配 Expo 的方案,无需额外配置:
- 安装依赖:
npx expo install expo-file-system
- 替代 TinyDB 的文件读写逻辑示例:
import * as FileSystem from 'expo-file-system'; // 获取 Expo 允许的文档目录路径 const filePath = `${FileSystem.documentDirectory}UserData.json`; // 初始化/读取数据 async function loadData() { const fileInfo = await FileSystem.getInfoAsync(filePath); if (!fileInfo.exists) { // 文件不存在时初始化空对象 await FileSystem.writeAsStringAsync(filePath, JSON.stringify({})); return {}; } const content = await FileSystem.readAsStringAsync(filePath); return JSON.parse(content); } // 保存数据 async function saveData(data) { await FileSystem.writeAsStringAsync(filePath, JSON.stringify(data)); }
方案二:使用 react-native-fs 适配 Expo
如果坚持用 react-native-fs,需注意 Expo 环境的路径规则,不能使用相对路径:
- 安装依赖:
npm install react-native-fs
- 调整代码示例:
import RNFS from 'react-native-fs'; // 获取 Expo 允许的文档目录路径 const filePath = `${RNFS.DocumentDirectoryPath}/UserData.json`; // 读取数据 async function loadData() { const exists = await RNFS.exists(filePath); if (!exists) { await RNFS.writeFile(filePath, JSON.stringify({}), 'utf8'); return {}; } const content = await RNFS.readFile(filePath, 'utf8'); return JSON.parse(content); } // 保存数据 async function saveData(data) { await RNFS.writeFile(filePath, JSON.stringify(data), 'utf8'); }
关键注意事项
- 禁止使用相对路径(如
../UserData.json),Expo 环境必须使用官方提供的目录路径(documentDirectory/DocumentDirectoryPath),否则会因权限限制无法访问文件。 - TinyDB 为 Node.js 环境设计,无法直接在 Expo 中运行,建议直接替换为上述适配 Expo 的文件读写逻辑。
内容的提问来源于stack exchange,提问作者DragoNico10
相关产品推荐
相关产品推荐

