Moim celem jest utworzenie indeksu indeksu trasy dla postów. Użytkownik powinien mieć możliwość określenia niektórych parametrów zapytania (tj. Tagów, typu), ale nie powinien być w stanie określić innych. Aby wyjaśnić:Hapijs i Joi: sprawdzanie poprawności parametrów zapytań z obecnością: "zabronione"
To jest w porządku:
/posts
/posts?tags=food
/posts?type=regular&tags=stackoverflow
To nie jest w porządku:
/posts?title=Hello
To Hapi paczka config:
servers: [
{
host: 'localhost',
port: 3000,
options: {
labels: ["api"],
validation: {
abortEarly: false,
presence: 'forbidden'
}
}
}
],
Proszę zauważyć opcję presence: forbidden
.
To config trasa:
handler: function (request, reply) {
Post.find(request.query, function (err, posts) {
if(err) {
console.log(err);
}
reply(posts);
});
},
validate: {
query: {
type: Joi.string().optional(),
tags: Joi.string().optional()
}
}
Mój pomysł był taki, że walidacja powinna dopuszczać dowolny podzbiór type
i tags
params (w tym pustym zapytania). Jednak po wykonaniu dowolnego z dozwolonych żądań pojawia się następujący błąd:
{
"statusCode": 400,
"error": "Bad Request",
"message": "value is not allowed",
"validation": {
"source": "query",
"keys": [
"value"
]
}
}
Dlaczego tak jest? Nie ma oczywiście klucza o nazwie value
. Jak sprawić, by walidacja zachowywała się tak, jak tego chcę?
Dziękujemy! Ta odpowiedź wyjaśniła kilka innych pytań, które miałem. Wydaje się, że to, co naprawdę chciałem jako ustawienie globalne, to obecność: "wymagane". Nie zdawałem sobie sprawy, że "zakazane" ustawienie było tak surowe. – zir