【发布时间】: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