React Native Firebase注册后无法创建用户节点问题求助
解决react-native-firebase注册后无法创建用户节点的问题
Hey,我看了你的问题描述和代码,马上就找到了核心问题——你在调用Firebase数据库的set()方法时,参数传错了!这也是为什么Android端出问题、iOS却能正常运行的原因,毕竟iOS对这类参数错误的容忍度比Android高一些。
问题出在哪?
看你这段代码:
.set({ name: userName, email: userEmail, id: user.uid }, dispatch({ type:REGISTER_SUCCESS, payload: user.uid }))
firebase.database().ref().set()的第二个参数应该是一个回调函数(用来确认数据写入是否成功),但你现在直接执行了dispatch(...),把它的返回值(一个React Native的ReadableNativeMap原生对象)传了进去。react-native-firebase的Android实现会尝试序列化这个参数,而原生Map对象根本没法被序列化,所以就抛出了你看到的那个错误;Mac下的Android没崩溃,但也因为参数不对,数据写入的逻辑没正常执行,自然就没生成用户节点。
修复后的代码
把dispatch和onSuccess的逻辑放到set()的回调里,等数据库写入成功后再执行这些操作,正确的写法如下:
//register export const registerUser = ( { userName, userEmail, password }, onSuccess, onFail ) => { console.log("register user", userEmail, password); return dispatch => { firebase .auth() .createUserWithEmailAndPassword(userEmail, password) .then(user => { console.log("registering user.uid: ", user.uid); firebase .database() .ref(`${DBREF_USERS}${user.uid}`) .set({ name: userName, email: userEmail, id: user.uid }) // 数据库写入成功后再执行redux dispatch和成功回调 .then(() => { dispatch({ type: REGISTER_SUCCESS, payload: user.uid }); onSuccess(); }) // 处理数据库写入失败的情况 .catch(dbError => { onFail(true, { dialogTitle: I18n.t("alert_dialog_title"), dialogBody: dbError.message }); }); }) .catch(error => { onFail(true, { dialogTitle: I18n.t("alert_dialog_title"), dialogBody: error.message }); }); }; };
额外要检查的点
- 数据库路径:确认
DBREF_USERS的结尾是/,比如'users/',不然拼接用户ID后会变成users12345这种错误路径,数据肯定写不进去 - 数据库规则:检查Firebase控制台的数据库规则,确保注册后的用户有写入自己节点的权限,比如可以设置:
{ "rules": { "users": { "$userId": { ".write": "auth.uid === $userId", ".read": "auth.uid === $userId" } } } } - 版本兼容性:你的react-native(0.54.2)和react-native-firebase(4.1.0)版本都比较老旧,虽然当前问题和版本无关,但后续如果遇到其他奇怪问题,可以考虑升级到稳定的新版本。
内容的提问来源于stack exchange,提问作者silverr
相关产品推荐
相关产品推荐

