javascript - 我无法使用 .push() 函数和使用 node.js 的 firebase 推送数据
问题描述
我们正在使用 nodejs 创建一个 firebase Web 应用程序,我们想上传一个包含大量信息的表单,但唯一上传的是 firebase 存储中的图像,但其他数据没有显示在 firebase 实时数据库中。这是按钮的 onclick 事件侦听器内部的代码块,但主要问题是 var newPostRef = databaseRef.push(); 的行。任何帮助或任何形式的建议将不胜感激。请帮帮我。
var databaseRef = firebase.database().ref().child("Items");
//Upload and save image to firebase storage
databaseRef.once("value").then(function(snapshot){
var name = picture["name"];
var dateStr = new Date().getTime();
var fileCompleteName = name + "_" + dateStr;
var storageRef = firebase.storage().ref("Items Images");
var itemStorageRef = storageRef.child(fileCompleteName);
var upload = itemStorageRef.put(picture);
upload.on("state_changed",
function error(err){
},
function complete(){
var user = firebase.auth().currentUser;
var userName;
firebase.database().ref('Users/' + user.uid).once('value').then(function(snapshot){
var fName = (snapshot.val() && snapshot.val().firstName);
var lName = (snapshot.val() && snapshot.val().lastName);
userName = fName + " " + lName;
});
upload.snapshot.ref.getDownloadURL().then(function(downloadURL){
var time = new Date();
var options = {
weekday: "long",
month: "long",
day: "2-digit",
year: "numeric",
};
var itemData = {
"uid": user.uid,
"name": fileCompleteName,
"itemName": iname,
"itemCategory": icategory,
"venueLast": ivenue,
"dateLast": idate,
"timeLast": itime,
"itemBrand": ibrand,
"itemColor": icolor,
"itemMaterial": imaterial,
"itemQty": iqty,
"repo": irepo,
"name": userName,
"image": downloadURL,
"time": time.toLocaleString('en-US', {hour: 'numeric', minute: 'numeric', hour12: true}),
"date": time.toLocaleDateString('en-US', options),
};
var newPostRef = databaseRef.push();
newPostRef.set(itemData, function(err){
if(err){
$("#result").attr("class", "alert alert-danger");
$("#result").html(err.message);
}
else{
$("#result").attr("class", "alert alert-success");
$("#result").html("post has been uploaded successfully.");
window.open("", "_self");
}
});
});
}
);
});
解决方案
您正在编写代码的某些部分,就好像它是同步的,但大部分是异步的。我非常强烈地假设变量userName
是undefined
在您尝试保存数据时。
这部分:
firebase
.database()
.ref("Users/" + user.uid)
.once("value")
.then(function (snapshot) {
var fName = snapshot.val() && snapshot.val().firstName;
var lName = snapshot.val() && snapshot.val().lastName;
userName = fName + " " + lName;
});
可能在此之前没有完成:
upload.snapshot.ref.getDownloadURL().then(function (downloadURL) {
var time = new Date();
var options = {
weekday: "long",
month: "long",
day: "2-digit",
year: "numeric",
};
var itemData = { //.....
尝试重写您的代码,以便使用async/await
. 您的代码中是否有任何错误?
推荐阅读
- php - PHP文件未保存到给定文件或目录
- javascript - 在 html 表单标签中使用 jquery var 值
- erlang - Erlang(和 Elixir 的扩展)是否提供了一种删除原子的方法?
- python - Given an html paragraph and a link, is there a way to retrieve the text before and the text after the link inside the paragraph in Python?
- javascript - 在 Joi 中使用动态上下文对象进行验证
- objective-c - NSWindow 在关闭并重新打开后崩溃
- c++ - 对象变量不更新
- png - ImageResizer:System.BadImageFormatException 导致 Web 应用程序崩溃,尽管在 try ... catch
- json - Flutter:从 JSON 渲染 UI 并动态存储/映射数据
- sql - 如何识别连续几年发生的事件?