javascript - Firebase 通过 REST 使用变量写入数据
问题描述
在我的应用程序中,我通过以下方式获取当前用户的 uid:我还从以下位置获取用户名:console.log 给了我正确的名称。但是当我尝试通过以下方式写入我的数据库时:
https://movieapp-8a157.firebaseio.com/users/${username}/${authUser}/posts.json?auth=${token}
它不起作用。如果我删除 ${username} 它将写入正确的路径。有任何想法吗?为了更加清晰,我编辑了我的帖子。
export const postJob = data => {
return async (dispatch, getState) => {
const randomColors = ["#f3a683"];
const colorNumber = Math.floor(Math.random() * 20) + 1;
const bgColor = randomColors[colorNumber];
const val = getState();
const userId = val.auth.userId;
const rules = {
description: "required|min:2"
};
const messages = {
required: field => `${field} is required`,
"description.min": "job description is too short"
};
try {
await validateAll(data, rules, messages);
const token = await firebase
.auth()
.currentUser.getIdToken(true)
.then(function(idToken) {
return idToken;
});
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
// User is signed in.
var displayName = user.displayName;
var email = user.email;
var emailVerified = user.emailVerified;
var photoURL = user.photoURL;
var isAnonymous = user.isAnonymous;
var uid = user.uid;
var providerData = user.providerData;
// ...
} else {
// User is signed out.
// ...
}
});
var user = firebase.auth().currentUser;
const authUser = user.uid;
const username = await firebase
.database()
.ref("users/" + authUser + "/name")
.once("value", function(snapshot) {
console.log("################", snapshot.val());
});
//console.log("#####################", authUser);
const response = await fetch(
`https://movieapp-8a157.firebaseio.com/users/${username}/${authUser}/posts.json?auth=${token}`,
{
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
titel: data.titel,
fname: data.fname,
description: data.description,
cover: data.cover,
friend: data.friend,
ownerId: userId,
bgColor: bgColor
})
}
);
const resData = await response.json();
解决方案
您获取 UID 的代码没有按照您预期的方式工作。auth 状态监听器是异步的,并且在accessesfirebase.auth().currentUser
. 这行代码实际上是在登录完成之前为您提供当前用户。这意味着它将是未定义的。
然后,您将使用该未定义值来构建对数据库中某个位置的引用。这导致实际参考与您期望的不同。 您应该添加调试日志以自己查看。
您应该使用回调来确定用户何时登录,并且只读取和写入该用户的位置。这意味着您可能应该将写入数据库的代码行移动到回调中,当您知道这user
是正确的时,并使用它user.uid
来构建用于读取和写入的数据库引用。
推荐阅读
- excel - 扫描文件夹中的 .jpg 文件名,匹配 Excel 工作表单元格中的文件名并将它们粘贴到单元格中
- r - R中带有paste0的新列
- php - 如果重复次数彼此不同,如何使用一个查询插入多条记录
- python - 剥离和重命名文件
- git - 在 GitLab 中使用个人访问令牌从提交中识别用户
- java - 即使不应该接受输入,JAVA程序也会一直阻止终端输入
- consul - Consul bootstrap-期望值
- javascript - 如何在 HostedWebApps 中使用 Cordova InAppBrowser?
- python - 跨系列映射有序字典
- cucumber - 使用 cucumber-jvm 4 并行运行黄瓜测试