2 votes

Différence étrange lors de l'utilisation de .populate() sur une méthode séparée entre findById() et find()

Je lis donc le code de mon aîné et je vois qu'il a fait quelque chose comme ça :

const getTechnicianByIdQuery = await TechnicianModel.findById({id: someId});
const wantedTechnician = await this.populateSingleTechnician(getTechnicianByIdQuery);

const populateSingleTechnician(technician: any): Promise<Technician>{
    const populatedTechnician = await technician
        .populate({path: 'salon',})
        .populate({path: 'user',})
        .execPopulate();
    return populatedTechnician;
};

Ce code fonctionne bien, et je pense que sa façon de faire est cool et nous permet de réutiliser le code. J'essaie donc de faire la même chose avec une recherche différente en utilisant find() au lieu de findById() :

const getTechnicianBySalonQuery = await TechnicianModel.find({salon: someSalonId})
const wantedTechnicianGroup = await this.populateTechnicianGroup(getTechnicianBySalonQuery);

const populateSingleTechnician(technicianGroup: any): Promise<Technician[]>{
    const populatedTechnicians = await technicianGroup
        .populate({path: 'salon',})
        .populate({path: 'user',})
        .execPopulate();
    return populatedTechnicians;
};

Mon code donne une erreur :

{ [ GraphQLError { message : 'technicianGroup.populate is not a function', locations : [Arra path : [Array] } [ ] data : null }

Comment se fait-il que mon code donne cette erreur alors que le sien fonctionne correctement et renvoie les données renseignées ? Si nous disons que la séparation du processus d'alimentation, qui est généralement mis en place en tant qu'opérateur de chaînage, a causé cette erreur, je me demande toujours quelle différence cela fait que le premier bloc de code fonctionne mais pas le mien.

D'autre part, j'ai utilisé la méthode traditionnelle qui consiste à enchaîner populated() à la requête et cela a bien fonctionné.

1voto

Grégory NEUT Points 8839

Lors de l'enchaînement, vous ne devez pas utiliser de await mot-clé. Lorsque vous utilisez await vous exécutez la requête.

Regardez le exemple de documentation .

const getTechnicianByIdQuery = TechnicianModel.findById({
  id: someId,
});

const wantedTechnician = await this.populateSingleTechnician(getTechnicianByIdQuery);

const populateSingleTechnician(technician: any): Promise<Technician> {
  const populatedTechnician = await technician
    .populate({
      path: 'salon',
    })
    .populate({
      path: 'user',
    })
    .execPopulate();
  return populatedTechnician;
};

La première fonctionne parce que await findById vous renvoie un mongoose.Document qui ont le .populate méthode disponible . Lorsque dans le second cas, le mongoose.Document[] n'a pas le populate (car il s'agit d'un tableau).


Je vois que vous utilisez le typecript, je vous recommande vivement de taper vos variables. Vous auriez vu une erreur à technician.populate si technician: any a été remplacé par le bon type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X