NodeJS et Mongoose : Boucle d'inclusion

a marqué ce sujet comme résolu.

Bonjour ! :)

Je suis en train de me mettre pour de bon à NodeJS, mais je rencontre mon premier problème.

J’utilise Mongoose, et j’ai ces deux modèles qui sont chacun dans un fichier :

models/Post.js :

const mongoose = require('mongoose');

const Comment = require('./Comment');

const postSchema = mongoose.Schema({
    title: { type: String, required: true },
    body: { type: String, required: true },
    image: { type: String },
    createdAt: { type: Date, default: Date.now() },
    updatedAt: { type: Date },
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

postSchema.post('findOneAndDelete', async post => {
    const postId = post._id;

    await Comment.find({
        post: postId
    }).then(comments => {
        comments.forEach(async comment => {
            await comment.delete();
        })
    });
});

module.exports = mongoose.model('Post', postSchema);

models/Comment.js :

const mongoose = require('mongoose');

const User = require('./User');
const Post = require('./Post');

const commentSchema = mongoose.Schema({
    author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
    post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' },
    body: { type: String, required: true }
});

commentSchema.post('remove', async comment => {
    const commentId = comment._id;

    await User.updateMany({
        comments: {
            $in: [commentId]
        }
    }, {
        $pull: {
            comments: commentId
        }
    });

    await Post.updateMany({
        comments: {
            $in: [commentId]
        }
    }, {
        $pull: {
            comments: commentId
        }
    });
});

commentSchema.post('findOneAndDelete', async comment => {
    const commentId = comment._id;

    await User.updateMany({
        comments: {
            $in: [commentId]
        }
    }, {
        $pull: {
            comments: commentId
        }
    });

    await Post.updateMany({
        comments: {
            $in: [commentId]
        }
    }, {
        $pull: {
            comments: commentId
        }
    });
});

module.exports = mongoose.model('Comment', commentSchema);

Alors déjà, j’ai plusieurs soucis. Mais pour le moment, je vais me concentrer sur le plus important : Ce code ne fonctionne pas.

J’ai une erreur ligne 49 du fichier models/Comment.js qui me dit que la fonction updateMany n’est pas définie.

En faisant quelques recherches, je me suis rendu compte que l’erreur était là parce que Comment.js require Post.js, et que Post.js require Comment.js. Bref, les deux s’inclue l’un l’autre, ce qui provoque cette erreur (et effectivement, si je retire le require('./Comment.js'); du fichier models/Comment.js, tout fonctionne).

Comment est-ce que je pourrais faire pour garder mes deux modèles dans leurs propre fichier, mais ne pas avoir cette inclusion mutuelle ?

Merci ! :)

+0 -0

Ça ressemble à un problème classique de dépendance cyclique. La seule solution propre, c’est de casser le cycle :

  • Soit en faisant en sorte que l’un des deux composants n’ait plus besoin de l’autre,
  • Soit en sortant les parties communes dans un 3ème composant, avec chacun des deux composants qui dépendent du module commun,
  • Soit en admettant que les modules sont tellement couplés que ça n’est qu’un seul module, et donc de les réunir.
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte