J'utilise la requête ci-dessous pour obtenir tous les formulaires d'un modèle ;

query = await Form.find({}).populate('assigned_to');

Le résultat de la requête est comme ci-dessous ;

[{
        **
        Some Other Fields **
        assigned_to: {
            links: [Array],
            _id: 5 d7a903d8b8f3e0ced2dd308,
            name: 'Test E 2',
            email: 'te2@somedomain.com',
            school: 5 d79e99b4d4df989ea771525,
            department: 5 d79e99b4d4df989ea771526,
            role: 'some_role',
            __v: 0
        },
    }, 
      **
    OTHER OBJECT 
      **
]

Exécution d'un Array.prototype.filter ;

waiting = query.filter(form =>
form.assigned_to._id == req.user._id);

Essayer d'accéder à la propriété _id de l'objet imbriqué assigned_to renvoie une erreur de ;

Impossible de lire la propriété 'id' d'undefined

Je comprends la nature de l'erreur étant que tous les formulaires n'ont pas un objet imbriqué assigned_to en même temps, ce qui entraînerait cette erreur car l'exécution d'un filtre sur le formulaire uniquement qui a que les objets imbriqués passent.

Comment puis-je améliorer ce filtre pour tenir compte de la possibilité que tous les formulaires n'aient pas d'objet imbriqué Assign_to ?

EDIT : à l'origine, je n'ai pas indiqué qu'il s'agissait d'un tableau d'objets par souci de concision.

0
Rohitus 27 sept. 2019 à 23:50

1 réponse

Meilleure réponse

Réponse à votre question "Comment puis-je améliorer ce filtre pour tenir compte de la possibilité que des formulaires n'aient pas d'objet imbriqué ? ». Assurez-vous que la requête renvoie un tableau.

Cela permettra de s'assurer que la clé "assigned_to" est présente. Vous pouvez utiliser une méthode de filtrage comme :-

arr.filter(elem => (elem.assigned_to && elem.assigned_to._id &&
elem.assigned_to._id === req.user._id));

Autrement

arr.filter(elem => {
  if(elem.assigned_to && elem.assigned_to._id) {
    if (elem.assigned_to._id === req.user._id) {
      return elem;
    }
  }
});
1
Garry 27 sept. 2019 à 21:06