Firestore模拟器中的“空值错误”

时间:2018-09-20 04:28:15

标签: firebase google-cloud-firestore

我正在尝试复制官方Firestore docs中的示例。您需要了解的所有信息都在屏幕截图上。是错误还是我错过了什么?

enter image description here

5 个答案:

答案 0 :(得分:3)

关键是通读评论。

  

许多应用程序将访问控制信息存储为文档中的字段   数据库。 Cloud Firestore安全规则可以动态地允许或   根据文档数据拒绝访问:

然后

  

///如果文档的“可见性”字段设置为“公开”,则允许用户读取数据

如果您查看指南中提供的示例数据

<?php
 $client = new SoapClient('http://services.chromedata.com/Description/7b?wsdl', array('trace' => 1));
 $account = ['number'=>"", 'secret'=>"", 'country'=>"US",    'language'=>"en"];
 $switch =  ["ShowAvailableEquipment", "ShowExtendedTechnicalSpecifications", "ShowExtendedDescriptions"];
 $vin = $_POST["b12"];

$result = $client->describeVehicle([
'accountInfo' => $account,
'switch' => $switch,
'vin' => $vin
]);

$resultxml = htmlentities($client->__getLastResponse()) . "\n";

$dom = new DOMDocument();
$dom->loadXML($resultxml);


$techData = [];
foreach ( $dom->getElementsByTagName('technicalSpecification') as $techSpec )   {
$id = $techSpec->getElementsByTagName('titleId')->item(0)->nodeValue;
$techData [$id]= $techSpec->getElementsByTagName('value')->item(0)->getAttribute("value")."<br>";

}

print_r($techData);
echo "<br>";

没有“可见性”字段,但是有名称,州名字段等。

如果要使用该数据集,请在每个城市中添加一个“可见性”字段,并将其值设置为“公开”

let citiesRef = db.collection("cities")
citiesRef.document("SF").setData([
    "name": "San Francisco",
    "state": "CA",
    "country": "USA",
    "capital": false,
    "population": 860000,
    "regions": ["west_coast", "norcal"]
])

答案 1 :(得分:2)

问题在于/cities/moscow上没有实际文档

答案 2 :(得分:1)

更多的解释将使Manidos的答案很好。

似乎resources仅应用于涉及已写入数据的规则;例如deletereadupdate

如果要对“将要”写入的数据设置规则,请使用getAfter

答案 3 :(得分:1)

问题是 - 作为 manidos - 指出文件 /cities/moscow 不存在,因此该文件不可访问。但是,指定规则的更简洁方法是:

allow read: if (resource == null) || (resource.data.visibility == 'public')

它允许应用程序查询不存在的数据,而不会因安全异常而爆炸。

答案 4 :(得分:0)

我仍在学习,但问题是

允许读取:if (resource == null) || (resource.data.visibility == 'public')

是当您对 /cities/{doc} 使用此类规则时。从我可以看到的资源 == null 每当您搜索没有确切文档 ID 的文档时;上面的规则将显示 /cities/{doc} 的所有内容,私有和公共,因为资源总是 == 空。

根据我已经能够拼凑的内容,只要在可以返回 1 个或多个文档的匹配项中,就必须使用 get(...) 语句直接访问文档的数据,所以

get(/database/...).data.visibility == 'public'