首页 > 解决方案 > 我无法使用 .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");
                }
              });
            });
          }
      );
      });

标签: javascriptnode.jsfirebase

解决方案


您正在编写代码的某些部分,就好像它是同步的,但大部分是异步的。我非常强烈地假设变量userNameundefined在您尝试保存数据时。

这部分:

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. 您的代码中是否有任何错误?


推荐阅读