似乎是query.startAt
规则被破坏了,或者我不明白。有人可以确认吗?这是最小的可重现误差。实例 https://querystartaterror.firebaseapp.com/;使用 CTRL+SHIFT+i 打开 Chrome 控制台。GitHub 仓库 https://github.com/ChrisChiasson/queryStartAtError.
数据库.rules.json:
{
"rules":{
".read": "query.startAt>0",
".write": false
}
}
索引.html
<!DOCTYPE html>
<html>
<body>
<script src="/__/firebase/7.6.1/firebase-app.js"></script>
<script src="/__/firebase/7.6.1/firebase-database.js"></script>
<script src="/__/firebase/init.js"></script>
<script>
function init(){
firebase.database.enableLogging(true);
const db=firebase.database();
const qry=db.ref("/").orderByChild('time').startAt(3);
//logging shows permission denied on next line
qry.once('value',s=>console.log("snapshot",s.val()));
}
init();
</script>
</body>
</html>
数据库内容:
Chrome 浏览器控制台输出显示权限被拒绝:
...snip...
@firebase/database: p:0: Listen on / for {"i":"time","sp":3}
@firebase/database: p:0: {"r":2,"a":"q","b":{"p":"/","q":{"sp":3,"i":"time"},"t":1,"h":""}}
...snip...
@firebase/database: p:0: from server: {"r":2,"b":{"s":"permission_denied","d":"Permission denied"}}
@firebase/database: p:0: listen response {"s":"permission_denied","d":"Permission denied"}
@firebase/database: event: /:cancel
如果database.rules.json修改为:
{
"rules":{
".read": true,
".write": false
}
}
监听的权限拒绝从浏览器控制台中消失:
...snip...
@firebase/database: p:0: Listen on / for {"i":"time","sp":3}
@firebase/database: p:0: {"r":2,"a":"q","b":{"p":"/","q":{"sp":3,"i":"time"},"t":1,"h":""}}
...snip...
@firebase/database: p:0: handleServerMessage d {"p":"","d":{"msg1":{"time":11}}}
@firebase/database: event: /:value:{"msg1":{"time":11}}
01:45:21.044 (index):13 snapshot {"msg1":{"time":11}}
@firebase/database: p:0: from server: {"r":2,"b":{"s":"ok","d":{"w":["no_index"]}}}
...snip...
这是从较大的应用程序中减少的,在较大的应用程序中,它表现为登录用户。