React Native Firebase Firestore无法保存数据且无报错问题求助
问题描述
我正在使用React Native Firebase和react-native-image-picker实现用户输入数据、选择或拍摄照片后将所有内容保存至Firestore的功能。我在handleCreateTool函数开头添加了打印语句,确认该函数已触发,但.then和.catch块中的日志从未打印,数据也未保存到Firestore。
相关代码
handleCreateTool函数
export const handleCreateTool = (tool: Tool) => { console.log('Attempting to create tool: ', tool.name); firestore() .collection('tools') .doc(tool.tid) .set({ tid: tool.tid, owner: tool.owner, name: tool.name, serialNum: tool.serialNum, imageUris: tool.imageUris, createdAt: tool.createdAt, updatedAt: tool.updatedAt, }) .then(() => { console.log('Tool created: ', tool.name); }) .catch(err => console.log('Error creating tool: ', err)); };
handleSavePress函数
const handleSavePress = () => { const tool: Tool = { tid: '123456asdfgh', serialNum: '013SN568TGH', name: 'Impact Wrench', imageUris: [], owner: 'Timmy', createdAt: new Date().getTime(), updatedAt: new Date().getTime(), }; console.log('TOOL: ', tool); handleCreateTool(tool); };
触发按钮代码
<Pressable onPress={() => handleSavePress()} style={({ pressed }) => [ { opacity: pressed ? 0.5 : 1.0 }, isSaveDisabled ? styles.saveButtonDisabled : styles.saveButton, ]} disabled={isSaveDisabled}> <Text style={styles.saveButtonText}>Save Tool</Text> </Pressable>
我也尝试过使用onPress={handleSavePress}的写法,但结果一致:无报错,也无法完成数据保存。另外,我使用完全相同的逻辑(仅修改集合名称和数据)保存用户数据时,功能正常,希望能得到相关排查思路。
排查思路
- 检查Firestore安全规则:确认
tools集合的写权限是否开放。比如当前规则是否只允许认证用户写入,而测试时未登录?或者规则中对tools集合有特殊字段校验要求。可以临时设置宽松规则调试(仅限开发环境):rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } - 改用async/await捕获隐藏错误:将
.then/.catch改为async/await写法,可能更容易捕获未被捕获的异常:export const handleCreateTool = async (tool: Tool) => { try { console.log('Attempting to create tool: ', tool.name); await firestore() .collection('tools') .doc(tool.tid) .set({ tid: tool.tid, owner: tool.owner, name: tool.name, serialNum: tool.serialNum, imageUris: tool.imageUris, createdAt: tool.createdAt, updatedAt: tool.updatedAt, }); console.log('Tool created: ', tool.name); } catch (err) { console.error('Error creating tool: ', err); } }; - 校验字段类型与Firestore兼容性:确认
Tool类型定义的字段和Firestore支持的类型是否匹配,比如createdAt用了毫秒数字,可尝试换成Firestore原生Timestamp类型测试:createdAt: firestore.Timestamp.fromDate(new Date()), updatedAt: firestore.Timestamp.fromDate(new Date()), - 检查文档ID合法性:确认
tool.tid是否符合Firestore文档ID规则,不能包含/、\、#、[、]、*字符,也不能是空字符串。 - 查看Firebase控制台日志:前往Firebase控制台的「Firestore -> 规则 -> 规则日志」,检查是否有被拒绝的写入请求;同时在「项目设置 -> 日志」中搜索相关错误信息。
- 开启Firestore调试模式:初始化Firestore时开启调试日志,查看底层操作细节:
import firestore from '@react-native-firebase/firestore'; firestore().settings({ debug: true }); - 确认网络连接状态:检查设备/模拟器的网络是否正常,Firestore在离线状态下会缓存操作,但未联网时
.then不会触发(除非启用持久化并等待同步)。
内容的提问来源于stack exchange,提问作者Sassenach6868
相关产品推荐
相关产品推荐

