实时数据库规则-检查给定数组是否包含newData.val()

时间:2019-03-18 15:47:17

标签: firebase firebase-realtime-database firebase-security-rules

我在RTDB中有一个属性,该属性只能是以下一项之一:$wh1Summaries = Warehouse1StockSummaries::newQuery(); if($request->type == 'product_name'){ $wh1Summaries = $wh1Summaries->with(['product' => function($q) use ($query) { $q->where('product_code','LIKE','%'.$query.'%'); }]); } else { $wh1Summaries = $wh1Summaries->with('product'); }

所以我试图以多种方式编写这种条件,但没有成功:

false, 5, 15, 30, 60

所以我最终得到了:

// Like in Firestore rules:
".write": "newData().val() in [false, 5, 15, 30, 60]"

// Like in ES6:
".write": "[false, 5, 15, 30, 60].includes(newData().val())"

// Like the old way:
".write": "[false, 5, 15, 30, 60].indexOf(newData().val()) > -1"

有没有什么办法可以检查".write": "(newData.val() === false || newData.val() === 5 || newData.val() === 15 || newData.val() === 30 || newData.val() === 60" 是否等于上述值之一而无需增加太多样板?

1 个答案:

答案 0 :(得分:1)

一种紧凑的方法是使用正则表达式。因此,根据您的示例,您可以利用".write": "(newData.val()+'').matches(/^(false|5|15|30|60)$/)"

但是,您可能希望对数据类型更严格一些,所以这样的方法比较理想:".write": "newData.val() === false || (newData.isNumber() && (newData.val()+'').matches(/^(5|15|30|60)$/))"

下面是一个小提琴,演示了这种行为:http://jsfiddle.net/katowulf/m5gzt423/