【问题标题】:Multi-location update not responding on NodeJS serverNodeJS服务器上的多位置更新没有响应
【发布时间】:2016-02-02 00:25:10
【问题描述】:

我正在尝试在 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 syncData (updatedUser) 是一个对象。

【问题讨论】:

  • 嗯...我没有立即看出这里有什么问题。你能做一些事情来帮助解决问题吗? 1. 你能console.log(updatedData) 并在你的问题中包含JSON,所以我可以看到/试试吗? 2. 你可以尝试在没有安全规则的情况下将相同的 JSON 写入数据库中的某个位置(只是为了让我们知道它是否与安全规则有关)?
  • 我刚刚发现syncData中的一个属性包含未定义,然后基本上它似乎不起作用。
  • 没错。如果任何值未定义,客户端将拒绝 update() 调用。但是,一旦您致电 update(),您应该会收到一条明确的错误消息。
  • 随时提供自我回答。否则我会投票关闭作为一个错字。
  • 奇怪的是我没有收到错误。但我会回答的。

标签: javascript node.js firebase


【解决方案1】:

问题是我在syncData 中的一个属性是undefined,意思是:解决方案正如我所解释的那样有效。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多