Firebase注册报auth/invalid-value标量字段传参错误排查
错误原因
你遇到的报错本质是参数类型不匹配:createUserWithEmailAndPassword接口要求传入的邮箱、密码参数为字符串类型的标量值,但你实际传入的是包含value、error字段的state对象,因此SDK解析参数时抛出"在标量字段上启动对象"的类型错误。
你的代码存在两个明确问题:
- 定义表单state时,
email、password都是对象结构,但调用接口时直接传入了整个对象,没有取其中存储实际输入值的value字段 - 代码中单独成行的
auth是无效冗余代码,Firebase v9及以上版本采用模块化API,createUserWithEmailAndPassword是独立导入的函数,不需要挂载在auth实例上调用
修复步骤
- 修改
registerscreen.js中的注册逻辑,传参时取state的value字段获取实际输入的字符串,同时删除冗余的单独auth行:
// 其余代码保持不变 const handleSignUp =() => { const nameError = nameValidator(name.value) const emailError = emailValidator(email.value) const passwordError = passwordValidator(password.value) if (emailError || passwordError || nameError) { setName({ ...name, error: nameError }) setEmail({ ...email, error: emailError }) setPassword({ ...password, error: passwordError }) return } // 移除冗余的单独auth行,传参时取.value获取字符串值 createUserWithEmailAndPassword(auth, email.value, password.value) .then(userCredentials => { const user = userCredentials.user; console.log(user.email) }) .catch(error => alert(error.message)) }
- 清理
firebase.js中的冗余导入,删掉未使用的依赖减少打包体积,修正后的初始化代码如下:
import { initializeApp } from "firebase/app"; import { getAuth } from "firebase/auth"; const firebaseConfig = { apiKey: "AIzaSyA1zo9ci0RXQYBNUooGtSK2b29OPxOC0GE", authDomain: "aslassistfinal.firebaseapp.com", databaseURL: "https://aslassistfinal-default-rtdb.firebaseio.com", projectId: "aslassistfinal", storageBucket: "aslassistfinal.appspot.com", messagingSenderId: "380652280816", appId: "1:380652280816:web:5f49bf6df4977cdb401b35", }; const app = initializeApp(firebaseConfig); const auth = getAuth(app); export { auth }
验证方式
修改完成后重新触发注册流程,传入符合格式要求的邮箱、密码字符串即可正常调用注册接口,不会再出现该类型错误。
内容的提问来源于stack exchange,提问作者Corey Sutton
相关产品推荐
相关产品推荐

