我正在尝试使用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
)是一个对象。
答案 0 :(得分:1)
问题是我在syncData中的一个属性是undefined
,这意味着:解决方案的工作方式正如我所解释的那样。
Frank van Puffelen指出,一旦尝试调用update(),就会收到明确的错误消息。