多位置更新在NodeJS服务器上没有响应

时间:2016-02-01 12:40:59

标签: javascript node.js firebase

我正在尝试使用NodeJS服务器上的以下设置在Firebase中执行multi-location update

function getPaths(ProductMeta, AuthData, productId) {
  var qPath = Q.defer();
  var ref = new Firebase(FBURL + "/products_tags/");

  console.log("get paths")

  var syncData = {
    timestamp_update: ProductMeta.timestamp_update,
    timestamp_create: ProductMeta.timestamp_create,
    price:            ProductMeta.price,
    nb_sales:         0,    // dynamic (watch out with edit mode)
    rating_avg:       0,    // dynamic (watch out with edit mode)
    rating_count:     0,    // dynamic (watch out with edit mode)
  };

  // Create the data we want to update
  var updatedData = {};

  updatedData["urlslug/" + returnUrlSlug(ProductMeta.title + "-" + ProductMeta.tagline) + "/" + productId] = syncData;
  updatedData["categoryId/" + ProductMeta.categoryId + "/" + productId] = syncData;
  updatedData["productType/" + ProductMeta.productType + "/" + productId] = syncData;
  updatedData["categoryId_productType/" + ProductMeta.categoryId + "-" + ProductMeta.productType + "/" + productId] = syncData;
  updatedData["username/" + AuthData.github.username + "/" + productId] = syncData;
  if(AuthData.github.hasOwnProperty('displayName')) {updatedData["displayName/" + AuthData.github.displayName + "/" + productId] = syncData;}
  var tagsRaw = ProductMeta["tagsString"].split(',');
  for(var i=0; i<tagsRaw.length; i++) {
    updatedData["tag/" + tagsRaw[i].trim() + "/" + productId] = syncData;
  };

  console.log("-----------", updatedData); // works fine

  var onComplete = function(error) {
    if (error) {
      console.log("Error updating data:", error);
      qPath.reject(error)
    } else {
      console.log("success")
      qPath.resolve("UPDATE_PRODUCTS_TAGS_SUCCESS")
    }
  };
  ref.update(updatedData, onComplete);
  return qPath.promise;
};

function returnUrlSlug(title) {
  return title.replace(/\W+/g, '-').toLowerCase();
};

我使用自定义令牌对用户进行身份验证,该令牌可以很好地传递测试。我的规则如下:

"products_tags": {
      ".read": true,
      "$method": {
        ".read": true,
        "$tag": {
          ".read": true,
          "$productId": {
            ".read": true,
            ".write": "auth !== null 
                      && (root.child('products_meta').child($productId).child('userId').val() === auth.uid
                      || root.child('products_tags').child($method).child($tag).child($productId).val() === null
                      || auth.uid == 'adminId')"
          } // productId
        } // tag
      } // method
    },

然而,当触发ref.update()时似乎没有任何事情发生。除了一段时间后超时之外,还没有返回的错误消息。

这里有什么用?

更新

我注意到当您设置为syncData = true时,更新会正常运行。但在我看来not consistent with this tutorial,其中syncDataupdatedUser)是一个对象。

1 个答案:

答案 0 :(得分:1)

问题是我在syncData中的一个属性是undefined,这意味着:解决方案的工作方式正如我所解释的那样。

Frank van Puffelen指出,一旦尝试调用update(),就会收到明确的错误消息。