我最近使用具有默认权限的测试数据库为Firebase编写了一些Cloud Functions。当我去使用主数据库上的函数(具有许多权限)并得到一堆警告,如:
FIREBASE WARNING: transaction at /some/path/to/value failed: permission_denied
经过一番搜索,我发现了adminRef
并将我所有的ref
s改为adminRef
s。我再次触发了这些功能,但仍然遇到了同样的错误。这是其中一个函数及其生成的日志的代码。
"use strict";
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const moment = require('moment');
admin.initializeApp(functions.config().firebase);
exports.myFunction1 = functions.database.ref('tree1/{productID}/').onWrite(event => {
const productID = event.params.productID;
if (!event.data.exists()) {
return Promise.resolve();
}
return event.data.adminRef.root.child('tree2').child(productID).transaction(function (data) {
if (data === null) {
return {default: 'value'}
}
return data
}).then(() => { console.log("Transaction finished") });
});
日志:
12:09:49.978 Function execution took 2599 ms, finished with status: 'error'
12:09:49.957 Error: permission_denied
at Error (native)
at Mh (/user_code/node_modules/firebase-admin/lib/database/database.js:238:437)
at Ch (/user_code/node_modules/firebase-admin/lib/database/database.js:236:351)
at /user_code/node_modules/firebase-admin/lib/database/database.js:236:286
at /user_code/node_modules/firebase-admin/lib/database/database.js:213:167
at kh.h.ud (/user_code/node_modules/firebase-admin/lib/database/database.js:214:104)
at Zg.ud (/user_code/node_modules/firebase-admin/lib/database/database.js:205:364)
at Qg.Xf (/user_code/node_modules/firebase-admin/lib/database/database.js:203:281)
at Tg (/user_code/node_modules/firebase-admin/lib/database/database.js:198:109)
at Client.Ha.onmessage (/user_code/node_modules/firebase-admin/lib/database/database.js:196:467)
12:09:49.950 FIREBASE WARNING: transaction at /tree2/xyz failed: permission_denied
以下是这些树的常规规则
{
"rules": {
".read": "auth.uid === 'abc123'",
".write": "auth.uid === 'abc123'",
"tree1": {
".read": "auth != null",
".write": "auth != null"
},
"tree2": {
".indexOn": ["something"],
".read": "auth != null",
".write": "auth != null"
}
}
}
我也尝试了这个,但错误仍然存在。
{
"rules": {
".read": "auth != null",
".write": "auth != null",
}
}
这可能有所帮助:
exports.myFunction1 = functions.database.ref('tree1/{productID}/').onWrite(event => {
const productID = event.params.productID;
if (!event.data.exists()) {
return;
}
return event.data.adminRef.child('tree2').child(productID).transaction(function (data) {
let default = 0;
return (data === null) ? default : data;
}).then(() => { console.log("Transaction finished") });
我发现了与transaction
有关adminRef
函数的类似问题。
看看这里:https://github.com/firebase/firebase-functions/issues/16#issuecomment-289094258
希望能帮助到你。