Aturan: Jenis
.membaca
Memberikan klien akses baca ke lokasi Firebase Realtime Database.
Aturan .read
adalah jenis Aturan Keamanan yang memberi klien akses baca ke lokasi Firebase Realtime Database. Misalnya:
".read": "auth != null && auth.provider == 'twitter'"
Nilai aturan .read
adalah string, yang dievaluasi sebagai subset sintaks ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan kebenaran. Aturan .read
yang memberikan izin untuk membaca suatu lokasi juga akan mengizinkan pembacaan turunan mana pun dari lokasi tersebut, meskipun turunan tersebut memiliki aturan .read
sendiri yang gagal.
Aturan .read
memiliki akses ke semua Variabel Aturan Firebase Realtime Database kecuali newData
.
.menulis
Memberikan klien akses tulis ke lokasi Firebase Realtime Database.
Aturan .write
adalah jenis Aturan Keamanan yang memberikan akses tulis kepada klien ke lokasi Firebase Realtime Database. Misalnya:
".write": "auth != null && auth.token.isAdmin == true"
Nilai aturan .write
adalah string, yang dievaluasi sebagai subset sintaks ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan kebenaran. Aturan .write
yang memberikan izin untuk menulis ke suatu lokasi juga akan mengizinkan penulisan ke turunan mana pun dari lokasi tersebut, meskipun turunan tersebut memiliki aturan .write
sendiri yang gagal.
Aturan .write
memiliki akses ke semua Variabel Aturan Firebase Realtime Database.
.mengesahkan
Digunakan setelah aturan .write
memberikan akses, untuk memastikan bahwa data yang ditulis sesuai dengan skema tertentu.
Aturan .validate
digunakan setelah aturan .write
memberikan akses, untuk memastikan bahwa data yang ditulis sesuai dengan standar tertentu. Selain akses pemberian .write
, semua aturan .validate
yang relevan harus berhasil sebelum penulisan diizinkan. Misalnya:
".validate": "newData.hasChildren(['name', 'age'])"
Nilai aturan .validate
adalah string, yang dievaluasi sebagai subset sintaks ekspresi JavaScript dengan beberapa perubahan perilaku untuk meningkatkan kejelasan dan kebenaran.
Aturan .validate
memiliki akses ke semua Variabel Aturan Firebase Realtime Database.
.indexOn
Meningkatkan kinerja kueri dengan memberi tahu Firebase Realtime Database kunci mana yang ingin data Anda diindeks.
Aturan .indexOn
memberi tahu server Firebase Realtime Database untuk mengindeks kunci tertentu dalam data Anda guna meningkatkan performa kueri Anda. Misalnya, jika ada database yang berisi kumpulan data dinosaurus, kita dapat meminta Firebase Realtime Database untuk mengoptimalkan kueri, sebelum kueri tersebut dikembalikan dari server, dengan menambahkan aturan ini:
{
"rules": {
"dinosaurs": {
".indexOn": ["height", "length"]
}
}
}
Anda dapat mengetahui informasi selengkapnya tentang aturan .indexOn
dengan merujuk ke bagian panduan keamanan tentang pengindeksan data Anda .
Aturan: Variabel
autentik
Variabel yang berisi payload token jika klien diautentikasi, atau null
jika klien tidak diautentikasi.
Firebase Realtime Database memungkinkan Anda mengautentikasi dengan mudah ke beberapa penyedia bawaan dan akan menghasilkan token autentikasi untuk penyedia tersebut. Setelah pengguna diautentikasi dengan salah satu penyedia bawaan, variabel autentikasi akan berisi yang berikut:
Bidang | Keterangan |
---|---|
provider | Metode autentikasi yang digunakan (misalnya "password", "anonymous", "facebook", "github", "google", atau "twitter"). |
uid | ID pengguna unik, dijamin unik di semua penyedia. |
token | Isi token ID Firebase Auth. Lihat auth.token . |
Sebagai contoh, kita dapat memiliki aturan seperti berikut untuk mengizinkan pengguna membuat komentar selama mereka menyimpan ID pengguna mereka dengan komentar tersebut:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && newData.child('user_id').val() == auth.uid"
}
}
}
Kami juga bisa membuat aturan seperti berikut untuk memperbolehkan pengguna membuat komentar selama mereka masuk menggunakan Facebook:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && auth.provider == 'facebook'"
}
}
}
auth.token
Variabel yang berisi konten token ID Firebase Auth.
Token berisi beberapa atau semua kunci berikut:
Bidang | Keterangan |
---|---|
email | Alamat email yang terkait dengan akun tersebut, jika ada. |
email_verified | true jika pengguna telah memverifikasi bahwa mereka memiliki akses ke alamat email . Beberapa penyedia secara otomatis memverifikasi alamat email yang mereka miliki. |
phone_number | Nomor telepon yang terkait dengan akun tersebut, jika ada. |
name | Nama tampilan pengguna, jika disetel. |
sub | UID Firebase pengguna. Ini unik dalam sebuah proyek. |
firebase.identities | Kamus semua identitas yang terkait dengan akun pengguna ini. Kunci kamus dapat berupa salah satu dari yang berikut: email , phone , google.com , facebook.com , github.com , twitter.com . Nilai kamus adalah rangkaian pengidentifikasi unik untuk setiap penyedia identitas yang terkait dengan akun. Misalnya, auth.token.firebase.identities["google.com"][0] berisi ID pengguna Google pertama yang terkait dengan akun tersebut. |
firebase.sign_in_provider | Penyedia masuk digunakan untuk mendapatkan token ini. Dapat berupa salah satu string berikut: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com . |
firebase.tenant | TenantId yang terkait dengan akun, jika ada. misalnya tenant2-m6tyz |
Jika menggunakan autentikasi khusus, auth.token
juga berisi klaim khusus apa pun yang ditentukan oleh pengembang.
Semua nilai ini dapat digunakan dalam aturan. Misalnya, untuk membatasi akses ke akun Google yang dikaitkan dengan alamat gmail.com, kita dapat menambahkan aturan:
{
"rules": {
".read": "auth != null",
"gmailUsers": {
"$uid": {
".write": "auth.token.email_verified == true && auth.token.email.matches(/.*@gmail.com$/)"
}
}
}
}
Untuk kelengkapan, kolom berikut juga disertakan, dalam auth.token
, namun sepertinya tidak berguna untuk aturan.
Bidang | Keterangan |
---|---|
iss | Penerbit token. |
aud | Penonton untuk token tersebut. |
auth_time | Terakhir kali pengguna mengautentikasi dengan kredensial menggunakan perangkat yang menerima token. |
iat | Waktu saat token dikeluarkan. |
exp | Waktu kadaluwarsa token. |
$lokasi
Variabel yang dapat digunakan untuk mereferensikan kunci $location
yang digunakan sebelumnya dalam struktur aturan.
Ketika Anda memiliki $location
dalam struktur aturan Anda, Anda dapat menggunakan variabel $
yang cocok dalam ekspresi aturan Anda untuk mendapatkan nama anak sebenarnya yang sedang dibaca atau ditulis. Jadi misalkan kita ingin memberi setiap pengguna akses baca dan tulis ke lokasi /users/<user>
mereka masing-masing. Kita bisa menggunakan:
{
"rules": {
"users": {
"$user": {
".read": "auth.uid === $user",
".write": "auth.uid === $user"
}
}
}
}
Ketika klien mencoba mengakses /users/barney
, lokasi default $user
akan cocok dengan $user
yang sama dengan "barney". Jadi aturan .read
akan memeriksa apakah auth.uid === 'barney'
. Akibatnya, pembacaan
hanya akan berhasil jika klien diautentikasi dengan nama "barney"./users/barney
Sekarang
Berisi jumlah milidetik sejak zaman Unix menurut server Firebase Realtime Database.
Variabel now
berisi jumlah milidetik sejak zaman UNIX menurut server Firebase Realtime Database. Misalnya, Anda dapat menggunakan ini untuk memvalidasi bahwa waktu yang created
pengguna tidak pernah disetel ke waktu di masa mendatang:
{
"rules": {
"users": {
"$user": {
"created": {
".validate": "newData.val() < now"
}
}
}
}
}
akar
RuleDataSnapshot yang sesuai dengan data saat ini di root Firebase Realtime Database Anda.
Variabel root memberi Anda RuleDataSnapshot yang sesuai dengan data saat ini di root Firebase Realtime Database Anda. Anda dapat menggunakan ini untuk membaca data apa pun di database Anda dalam ekspresi aturan Anda. Misalnya, jika kita ingin memperbolehkan pengguna membaca /comments
hanya jika /users/<id>/active
mereka disetel ke true, kita dapat menggunakan:
{
"rules": {
"comments": {
".read": "root.child('users').child(auth.uid).child('active').val() == true"
}
}
}
Kemudian, jika /users/barney/active
berisi nilai true, pengguna yang diautentikasi dengan uid "barney" dapat menulis ke node /comments
.
data
RuleDataSnapshot yang sesuai dengan data saat ini di Firebase Realtime Database di lokasi aturan yang sedang dijalankan.
Variabel data memberi Anda RuleDataSnapshot yang sesuai dengan data saat ini di lokasi database dari aturan yang sedang dijalankan (sebagai lawan dari root, yang memberi Anda data untuk root database Anda).
Jadi misalnya, jika Anda ingin mengizinkan klien mengakses /users/<user>
jika /users/<user>/public
disetel ke true, Anda dapat menggunakan:
{
"rules": {
"users": {
"$user": {
".read": "data.child('public').val() == true"
}
}
}
}
Variabel data tersedia dalam aturan .read
, .write
, dan .validate
.
Data baru
RuleDataSnapshot yang sesuai dengan data yang akan dihasilkan jika penulisan diperbolehkan.
Untuk aturan .write
dan .validate
, variabel newData memberi Anda RuleDataSnapshot yang sesuai dengan data yang akan dihasilkan jika penulisan diizinkan (ini adalah "penggabungan" data yang sudah ada ditambah data baru yang sedang ditulis). Jadi jika Anda ingin memastikan bahwa setiap pengguna memiliki nama dan usia, Anda dapat menggunakan:
{
"rules": {
"users": {
"$user": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['name', 'age'])"
}
}
}
}
Karena newData menggabungkan data yang ada dan data baru, ia berperilaku baik bahkan untuk pembaruan "sebagian". Misalnya:
var fredRef = firebase.database().ref("users/fred");
// Valid since we have a name and age.
fredRef.set({ name: "Fred", age: 19 });
// Valid since we are updating the name but there's already an age.
fredRef.child("age").set(27);
// Invalid since the .validate rule will no longer be true.
fredRef.child("name").remove();
Variabel newData tidak tersedia dalam aturan .read
karena tidak ada data baru yang ditulis. Anda sebaiknya menggunakan data saja.
RuleDataSnapshot: Metode
val()
Mendapatkan nilai primitif ( string
, number
, boolean
, atau null
) dari RuleDataSnapshot ini.
Nilai Pengembalian : ( String
, Number
, Boolean
, Null
) - Nilai primitif dari RuleDataSnapshot ini .
Berbeda dengan DataSnapshot.val()
, memanggil val()
pada RuleDataSnapshot yang memiliki data anak tidak akan mengembalikan objek yang berisi anak tersebut. Ini malah akan mengembalikan nilai penjaga khusus. Hal ini memastikan peraturan selalu dapat beroperasi dengan sangat efisien.
Sebagai konsekuensinya, Anda harus selalu menggunakan child()
untuk mengakses anak-anak (misalnya data.child('name').val()
, bukan data.val().name
).
Contoh ini hanya mengizinkan pembacaan jika turunan isReadable disetel ke true di lokasi yang sedang dibaca.
".read": "data.child('isReadable').val() == true"
anak()
Mendapatkan RuleDataSnapshot untuk lokasi di jalur relatif yang ditentukan.
Argumen : childPath
String
- Jalur relatif ke lokasi data anak.
Nilai Pengembalian : RuleDataSnapshot
- RuleDataSnapshot untuk lokasi anak.
Jalur relatif dapat berupa nama anak sederhana (misalnya 'fred') atau jalur yang dipisahkan garis miring (misalnya 'fred/nama/pertama'). Jika lokasi anak tidak memiliki data, RuleDataSnapshot kosong akan dikembalikan.
Contoh ini hanya mengizinkan pembacaan jika turunan isReadable disetel ke true di lokasi yang sedang dibaca.
".read": "data.child('isReadable').val() == true"
induk()
Mendapatkan RuleDataSnapshot untuk lokasi induk.
Nilai Pengembalian : RuleDataSnapshot
- RuleDataSnapshot untuk lokasi induk.
Jika instance ini merujuk ke root Firebase Realtime Database Anda, instance tersebut tidak memiliki induk, dan parent()
akan gagal, sehingga menyebabkan ekspresi aturan saat ini dilewati (sebagai kegagalan).
Contoh ini hanya mengizinkan pembacaan jika saudara isReadable disetel ke true.
".read": "data.parent().child('isReadable').val() == true"
hasChild(childPath)
Mengembalikan nilai benar jika anak yang ditentukan ada.
Argumen : childPath
String
- Jalur relatif ke lokasi calon anak.
Nilai Pengembalian : Boolean - true
jika data ada di jalur anak yang ditentukan; jika tidak, false
.
Contoh ini hanya mengizinkan penulisan data jika berisi "nama" anak.
".validate": "newData.hasChild('name')"
hasChildren([anak-anak])
Memeriksa keberadaan anak-anak.
Argumen : Array
children
opsional - Array kunci anak yang semuanya harus ada.
Nilai Pengembalian : Boolean
- true
jika anak (yang ditentukan) ada; jika tidak, false
.
Jika tidak ada argumen yang diberikan, argumen tersebut akan mengembalikan nilai true jika RuleDataSnapshot memiliki turunan. Jika array nama anak disediakan, array tersebut akan mengembalikan nilai true hanya jika semua anak yang ditentukan ada di RuleDataSnapshot .
Contoh ini hanya mengizinkan penulisan data jika berisi satu atau lebih turunan.
".validate": "newData.hasChildren()"
Contoh ini hanya memperbolehkan penulisan data jika berisi "nama" dan "umur" anak.
".validate": "newData.hasChildren(['name', 'age'])"
ada()
Mengembalikan nilai benar jika RuleDataSnapshot ini berisi data apa pun.
Nilai Pengembalian : Boolean
- true
jika RuleDataSnapshot berisi data apa pun; jika tidak, false
.
Fungsi yang ada mengembalikan nilai true jika RuleDataSnapshot ini berisi data apa pun. Ini murni fungsi kenyamanan karena data.exists()
setara dengan data.val() != null
.
Contoh ini mengizinkan penulisan di lokasi ini selama tidak ada data.
".write": "!data.exists()"
dapatkan Prioritas()
Mendapatkan prioritas data dalam RuleDataSnapshot .
Nilai Pengembalian : ( String
, Number
, Null
) - Prioritas data dalam RuleDataSnapshot ini.
Contoh ini memastikan bahwa data baru yang ditulis memiliki prioritas
".validate": "newData.getPriority() != null"
isNumber()
Mengembalikan nilai benar jika RuleDataSnapshot ini berisi nilai numerik.
Nilai Pengembalian : Boolean
- true
jika datanya numerik; jika tidak, false
.
Contoh ini memastikan bahwa data baru yang ditulis memiliki "usia" anak dengan nilai numerik.
".validate": "newData.child('age').isNumber()"
isString()
Mengembalikan nilai benar jika RuleDataSnapshot ini berisi nilai string.
Nilai Pengembalian : Boolean
- true
jika datanya berupa String
; jika tidak, false
.
Contoh ini memastikan bahwa data baru yang ditulis memiliki "nama" anak dengan nilai string.
".validate": "newData.child('name').isString()
isBoolean()
Mengembalikan nilai benar jika RuleDataSnapshot ini berisi nilai boolean.
Nilai Pengembalian : Boolean
- true
jika datanya adalah Boolean
; jika tidak, false
.
Contoh ini memastikan bahwa data baru yang ditulis memiliki anak "aktif" dengan nilai boolean.
".validate": "newData.child('active').isBoolean()"
Tali: Properti
panjang
Mengembalikan panjang string.
Return Value : Number
- Jumlah karakter dalam string.
Contoh ini memerlukan string minimal 10 karakter.
".validate": "newData.isString() && newData.val().length >= 10"
Tali: Metode
berisi (substring)
Mengembalikan nilai benar jika string berisi substring yang ditentukan.
Argumen : substring
String
- Substring yang harus dicari.
Nilai Pengembalian : Boolean
- true
jika string berisi substring yang ditentukan; jika tidak, false
.
Contoh ini memerlukan data berupa string yang berisi "@".
".validate": "newData.isString() && newData.val().contains('@')"
dimulaiDengan(substring)
Mengembalikan nilai benar jika string dimulai dengan substring yang ditentukan.
Argumen : substring
String
- Substring yang harus dicari di awal.
Nilai Pengembalian : Boolean
- true
jika string berisi substring yang ditentukan; jika tidak, false
.
Contoh ini mengizinkan akses baca jika auth.token.identifier
dimulai dengan "internal-"
".read": "auth.token.identifier.beginsWith('internal-')"
berakhirDengan(substring)
Mengembalikan nilai benar jika string diakhiri dengan substring yang ditentukan.
Argumen : substring
String
- Substring yang harus dicari di akhir.
Nilai Pengembalian : Boolean
- true
jika string diakhiri dengan substring yang ditentukan; jika tidak, false
.
Contoh ini mengizinkan akses baca jika auth.token.identifier
diakhiri dengan "@company.com"
".read": "auth.token.identifier.endsWith('@company.com')"
ganti(substring, penggantian)
Mengembalikan salinan string dengan semua contoh substring tertentu diganti dengan string pengganti yang ditentukan.
Argumen : substring String
- Substring yang harus dicari. replacement String
- Sebuah string untuk menggantikan substring.
Nilai Pengembalian : String
- String baru setelah mengganti substring dengan pengganti.
Metode replace()
sedikit berbeda dari metode replace()
JavaScript karena metode ini menggantikan semua instance dari substring tertentu dengan string pengganti yang ditentukan, bukan hanya instance pertama.
Karena titik tidak diperbolehkan dalam kunci, kita perlu meng-escape string dengan titik sebelum menyimpannya. Contohnya adalah dengan alamat email. Asumsikan kita memiliki daftar alamat email yang masuk daftar putih di node /whitelist/
kita:
{
"user": {
"$uid": {
"email": <email>
}
},
"whitelist": {
"fred@gmail%2Ecom": true,
"barney@aol%2Ecom": true
}
}
Kita dapat membuat aturan yang hanya mengizinkan pengguna untuk ditambahkan jika email mereka ada di node /whitelist/
:
{
"rules": {
"users": {
"$uid": {
".read": "true",
".write": "root.child('whitelist').child(newData.child('email').val().replace('.', '%2E')).exists()"
}
}
}
}
ke Huruf Kecil()
Mengembalikan salinan string yang dikonversi ke huruf kecil.
Nilai Pengembalian : String
- String diubah menjadi huruf kecil.
Contoh ini memungkinkan akses baca jika auth.token.identifier
karena semua huruf kecil ada di bawah /users
.
".read": "root.child('users').child(auth.token.identifier.toLowerCase()).exists()"
ke Huruf Besar()
Mengembalikan salinan string yang dikonversi ke huruf besar.
Nilai Pengembalian : String
- String diubah menjadi huruf besar.
Contoh ini memungkinkan akses baca jika auth.token.identifier
karena semua huruf besar ada di bawah /users
.
".read": "root.child('users').child(auth.token.identifier.toUpperCase()).exists()"
cocok (regex)
Mengembalikan nilai benar jika string cocok dengan literal ekspresi reguler yang ditentukan.
Nilai Pengembalian : Boolean
- true
jika string cocok dengan literal ekspresi reguler, regex; jika tidak, false
.
Lihat dokumentasi aturan regex selengkapnya.
Operator
+ (tambahkan)
Digunakan untuk menambahkan variabel atau untuk penggabungan string.
Contoh berikut memastikan bahwa nilai baru menambah nilai yang sudah ada sebanyak satu. Ini berguna untuk mengimplementasikan penghitung:
".write": "newData.val() === data.val() + 1"
".validate": "root.child('room_names/' + $room_id).exists()"
- (meniadakan atau mengurangi)
Digunakan untuk meniadakan nilai atau mengurangi dua nilai dalam ekspresi aturan.
Aturan validasi ini memeriksa apakah nilai baru adalah kebalikan dari nilai turunan di lokasi:
".validate": "newData.val() === -(data.child('quantity').val())"
Contoh berikut menggunakan pengurangan untuk memastikan bahwa hanya pesan dari sepuluh menit terakhir yang dapat dibaca:
".read": "newData.child('timestamp').val() > (now - 600000)"
* (kalikan)
Digunakan untuk mengalikan variabel dalam ekspresi aturan.
Aturan validasi ini memeriksa apakah nilai baru sama dengan produk harga dan kuantitas (dua nilai yang ada):
".validate": "newData.val() === data.child('price').val() * data.child('quantity').val()"
/ (membagi)
Digunakan untuk membagi variabel dalam ekspresi aturan.
Dalam contoh berikut, aturan validasi memastikan bahwa data yang disimpan adalah rata-rata dari total data yang disimpan di tempat lain:
".validate": "newData.val() === data.parent().child('sum').val() / data.parent().child('numItems').val()"
% (modulus)
Digunakan untuk mencari sisa pembagian satu variabel dengan variabel lain dalam ekspresi aturan.
Aturan ini memvalidasi bahwa hanya bilangan genap yang dapat ditulis:
".validate": "newData.val() % 2 === 0"
=== (sama dengan)
Digunakan untuk memeriksa apakah dua variabel dalam ekspresi aturan memiliki tipe dan nilai yang sama.
Aturan berikut menggunakan operator === untuk memberikan akses tulis hanya kepada pemilik akun pengguna. Uid pengguna harus sama persis dengan kunci ( $user_id
) agar aturan dapat dievaluasi menjadi benar.
"users": {
".write": "$user_id === auth.uid"
}
!== (tidak sama)
Digunakan untuk memeriksa apakah dua variabel dalam ekspresi aturan tidak sama.
Aturan baca berikut memastikan bahwa hanya pengguna yang masuk yang dapat membaca data:
".read": "auth !== null"
&& (DAN)
Mengevaluasi menjadi benar jika kedua operan benar. Digunakan untuk mengevaluasi beberapa kondisi dalam ekspresi aturan.
Aturan validasi berikut memeriksa apakah data baru berupa string yang kurang dari 100 karakter:
".validate": "newData.isString() && newData.val().length < 100"
|| (ATAU)
Mengevaluasi menjadi benar jika salah satu operan dalam ekspresi aturan benar.
Pada contoh ini kita bisa menulis selama data lama atau data baru belum ada. Dengan kata lain, kita dapat menulis jika kita menghapus atau membuat data, namun tidak memperbarui data.
".write": "!data.exists() || !newData.exists()"
! (BUKAN)
Mengevaluasi menjadi benar jika operan tunggalnya salah. Dalam ekspresi aturan, ! Operator sering digunakan untuk melihat apakah data telah ditulis ke suatu lokasi.
Aturan berikut hanya mengizinkan akses tulis jika tidak ada data di lokasi yang ditentukan:
".write": "!data.exists()"
> (lebih besar dari)
Digunakan untuk memeriksa apakah suatu nilai lebih besar dari nilai lain dalam ekspresi aturan.
Aturan validasi ini memeriksa bahwa string yang ditulis bukanlah string kosong:
".validate": "newData.isString() && newData.val().length > 0"
< (kurang dari)
Digunakan untuk memeriksa apakah suatu nilai lebih kecil dari nilai lain dalam ekspresi aturan.
Aturan validasi ini memeriksa apakah string kurang dari 20 karakter:
".validate": "newData.isString() && newData.val().length < 20"
>= (lebih besar atau sama dengan)
Digunakan untuk memeriksa apakah suatu nilai lebih besar atau sama dengan nilai lain dalam ekspresi aturan.
Aturan validasi ini memeriksa bahwa string yang ditulis bukanlah string kosong:
".validate": "newData.isString() && newData.val().length >= 1"
<= (kurang dari atau sama dengan)
Digunakan untuk memeriksa apakah suatu nilai kurang dari atau sama dengan nilai lain dalam ekspresi aturan.
Aturan validasi ini memastikan bahwa data baru tidak dapat ditambahkan di masa mendatang:
".validate": "newData.val() <= now"
? (operator terner)
Digunakan untuk mengevaluasi ekspresi aturan bersyarat.
Operator ternary mengambil tiga operan. Operan sebelum ? adalah kondisinya. Jika kondisi bernilai benar, operan kedua akan dievaluasi. Jika kondisinya salah, operan ketiga akan dievaluasi.
Untuk aturan validasi berikut, nilai baru dapat berupa angka atau boolean. Jika berupa angka, maka harus lebih besar dari 0.
".validate": "newData.isNumber() ? newData.val() > 0 : newData.isBoolean()"