NodeJS: Mongoose jak sprawdzić czy podano tablicę w modelu danych?

Opublikowano: 05.04.2022 - tagi: NodeJS MongoDB Mongoose Walidacja Model Tablica JavaScript

W jednym z poprzednich wpisów pisałem o walidacji danych w bibliotece Mongoose.

Dzisiaj opiszę konkretny przypadek: jak sprawdzić, czy przekazano do modelu tablicę, która jest wymagana?

Sprawdzanie tablicy

Załóżmy, że mam taki model danych:

const PostSchema = new Schema({
title: { type: String, required: true },
tags: { type: [String], required: true }
});
const PostModel = mongoose.model('post', PostSchema);

Definiujemy model danych, w którym mamy dwa parametry: title i tags. Oba są wymagane. Przy czym title to zwykły ciąg znaków, a tags to zwykła tablica tekstowa.

Poniżej znajduje się fragment kodu, który sprawdza poprawność danych w modelu i próbuje dodać nowy rekord do bazy danych:

const newEntry = PostModel({ title: 'Some entry' });

const validateErrors = newEntry.validateSync(); 
console.log('validateErrors: ', validateErrors);

try {
  await PostModel.create(newEntry);
} catch(error) {
  console.log('error: ', error);
}

Pytanie: czy metoda validateSync powinna zwrócić jakieś błędy/błąd walidacji? Czy wszystko tutaj jest ok? Do modelu przekazujemy jedno pole: title, które jest wymagane. Nie przekazaliśmy jednak pola: tags, które także jest wymagane. Więc odpowiedź jest prosta! Zwróci błąd walidacji!

To nieprawda. Rekord zostanie dodany do bazy.

Jak to możliwe?

Walidacja wymaganej tablicy

Żeby dowiedzieć się, co się stało, sprawdźmy zawartość bazy danych. Okazuje się, że pole tags to pusta tablica!

Jeśli w modelu danych zdefiniowaliśmy typ tablica i przy tworzeniu rekordu pominiemy to pole, w takim przypadku zostanie umieszczona pusta tablica.

A co zrobić jeśli chcemy jednak wymagać podania tablicy? Prosta rzecz:

...
tags: { type: [String], required: true, default: undefined }

Definiujemy dodatkowe pole: default i ustawiamy je na undefined. Po tej zmianie zostanie zgłoszony błąd walidacji, a rekord nie zostanie dodany do bazy danych.