firebase - protect - "Error": "Índice no definido, agregar".indexOn "
protect firebase database (1)
He creado una base de datos en Firebase que se parece a:
Ahora entro en un cliente REST y emito esta consulta:
https://movielens3.firebaseio.com/movieLens/users.json?orderBy="age"&startAt=25&print=pretty
Me da un error:
"error": "Index not defined, add ".indexOn": "age", for path "/movieLens/users", to the rules"
Así que entro en la sección de reglas y defino esta regla:
{
"rules": {
"users" : {
".indexOn": ["age", "gender", "occupation", "zipCode"]
},
".read": true,
".write": true
}
}
Pero sigo teniendo el mismo error.
Estás definiendo índices para /users
. No hay users
nodo hijo directamente debajo de la raíz de su árbol, por lo que esos índices estarán vacíos.
Estás consultando /movieLens/users
, así que ahí es donde se debe definir el índice:
{
"rules": {
"movieLens": {
"users" : {
".indexOn": ["age", "gender", "occupation", "zipCode"]
},
".read": true,
".write": true
}
}
}
Actualización por problema en los comentarios:
Estás almacenando la edad del usuario como una cadena, por lo que no puedes filtrarla como un número. La solución es arreglar sus datos y almacenarlos como un número.
Pero mientras tanto, esta consulta algo funciona:
https://movielens3.firebaseio.com/movieLens/users.json?orderBy="age"&equalTo="35"
En JavaScript:
ref
.orderByChild(''age'')
.startAt(''35'')
.limitToFirst(3)
.once(''value'', function(s) {
console.log(JSON.stringify(s.val(), null, '' ''));
}, function(error) {
if(error) console.error(error);
})
El "algo" es que hace un ordenamiento léxico, no numérico. Arregla los datos para una solución real.
Tenga en cuenta que también está ignorando las mejores prácticas de Firebase al almacenar los datos como una matriz. Esto ya me estaba causando problemas en la API de REST, por lo que solté print=pretty
. Le recomiendo que lea la guía de programación de Firebase para desarrolladores de JavaScript de principio a fin y siga los consejos que se encuentran allí. Las pocas horas que toma ahora, evitarán muchas horas de problemas en el futuro.