Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Permissions firebase once()给出权限错误,但ref()成功_Permissions_Firebase - Fatal编程技术网

Permissions firebase once()给出权限错误,但ref()成功

Permissions firebase once()给出权限错误,但ref()成功,permissions,firebase,Permissions,Firebase,目标:扫描firebase数据并删除超过给定时间的项目 问题是:尽管允许其他读取操作,但查询生成了权限错误。然而问题似乎在于。阅读规则,因为当它被取出时,一切都正常 我使用嵌入了“username”和“dataClass”的令牌进行身份验证。身份验证通常工作正常,订阅的客户端正在接收更新。调试日志和检查auth()负载表明“username”和“dataClass”正确嵌入到令牌中,并由Firebase正确提取 但是,尝试使用once()获取早于特定时间的数据子集会产生权限错误。但是,我可以使用

目标:扫描firebase数据并删除超过给定时间的项目

问题是:尽管允许其他读取操作,但查询生成了权限错误。然而问题似乎在于。阅读规则,因为当它被取出时,一切都正常

我使用嵌入了“username”和“dataClass”的令牌进行身份验证。身份验证通常工作正常,订阅的客户端正在接收更新。调试日志和检查auth()负载表明“username”和“dataClass”正确嵌入到令牌中,并由Firebase正确提取

但是,尝试使用once()获取早于特定时间的数据子集会产生权限错误。但是,我可以使用ref()查看数据位置,没有错误。为什么ref()有效而查询无效?可能存在的基本误解:查询是否像在SQL数据库中一样返回数据的副本,还是返回指向数据的指针

下面是代码,后面是正在使用的规则。谢谢你

var Firebase = require('firebase');
Firebase.enableLogging(true, true);

// auth token is passed in as an argument
var token;
process.argv.forEach(function(val, index, array) {if (index==2) {token=val;} });

var oneHourAgo=(new Date).getTime() - (minutes*60000);

var fb=new Firebase("https://<mysite>.firebaseio.com/changeMessages");
connect2Firebase(fb,token);


function connect2Firebase(firebase,authToken) {
  firebase.auth(authToken, function(error,payload) {
    if(error) {
      console.log("Login Failed!", error);
    } else {
      console.log("Login Succeeded!");
      console.log(payload);
      doSomething();
    }
  });
}


function doSomething() {
  // THIS GIVES PERMISSION ERROR
  fb.endAt(oneHourAgo).once('value', function(ss) { console.log(ss.val()); });

  // THIS WORKS
  //console.log(fb.endAt(oneHourAgo).ref().toString());
}


// THE RULES.  Changing to ".read":true makes it work.
{
  "rules": {
    "changeMessages": {
      "$dataClass": {
      ".read": "auth.dataClass == $dataClass && auth.username == 'admin'",
      ".write": "auth.username == 'admin'"
  }
}
var Firebase=require('Firebase');
Firebase.enableLogging(true,true);
//身份验证令牌作为参数传入
var代币;
process.argv.forEach(函数(val,index,array){if(index==2){token=val;}});
var oneHourAgo=(新日期).getTime()-(分钟*60000);
var fb=新的火基(“https://.firebaseio.com/changeMessages");
connect2Firebase(fb,令牌);
函数connect2Firebase(firebase、authToken){
firebase.auth(authToken,函数(错误,有效负载){
如果(错误){
log(“登录失败!”,错误);
}否则{
log(“登录成功!”);
控制台日志(有效载荷);
doSomething();
}
});
}
函数doSomething(){
//这会导致权限错误
once('value',函数(ss){console.log(ss.val());});
//这很有效
//log(fb.endAt(oneHourAgo.ref().toString());
}
//规则。更改为“.read”:true可使其正常工作。
{
“规则”:{
“更改消息”:{
“$dataClass”:{
“.read”:“auth.dataClass=$dataClass&&auth.username=='admin',
“.write”:“auth.username=”admin“
}
}
}
}

.ref()是一个本地操作(它实际上不涉及到与服务器的任何连接),只需在服务器上创建一个新的路径“引用”,因此这永远不会导致权限错误。澄清一下,您是说如果更改传递到endAt()中的日期值,此查询将起作用吗?不完全正确。现在所有的数据都超过一个小时了,所以所有的数据都应该被选中。但没有一个是这样的,事实上,无论将什么日期值传递到endAt(),它都会给出一个权限错误。使用模拟器,规则按预期工作,并且在auth JSON中以给定值接受读取。对于实际的程序,debug显示在auth()中传递了相同的值,但是“once('value'…”返回“permission denied”。关于once()。这可能是异步的吗?另外,我不想只是下载一份数据到客户端,我最终想删除Firebase服务器上超过一小时的数据。@kato,另一种方法如何:不编写单独的服务器程序(我在Node.js中这样做)要删除旧的firebase数据,请在客户端连接时设置一个简单的事件:
firebaseRef.endAt(timestoneHourago).on(“child_added”,函数(snap){snap.ref().remove();}
添加这样的事件,甚至数千个,应该是有效的。但是,remove()会生成一个“child_added”事件,这是一个循环引用,可能会导致挂起。使用once()设置事件将无法保持清理。如何绕过循环引用?如果op在模拟器中工作,但在客户端上不工作,则验证令牌不能相同。.once()是异步的,但上面的示例作为异步事件运行良好。您的示例安全规则中缺少一个};它们是否准确?您可以将debug:true添加到令牌的“选项”部分(第二个参数),以查看类似于客户端模拟器的输出。