2017-07-06 3 views
0

J'essaie actuellement d'ajouter un validateur personnalisé à mon schéma. Pour une raison quelconque, je ne peux pas interroger la base de données. Est-ce que quelqu'un sait une solution pour mon problème?Validateur personnalisé Mongoose: vérifiez si la valeur existe dans la base de données

C'est le schéma:

var Portfolio = new Schema({ 
    title: { 
     type: String, 
     required: [true, 'Title is required'] 
    }, 
    thumbnail: { 
     type: String, 
     required: [true, 'Thumbnail is required'], 
    }, 
    description: String, 
    date: Date, 
    images: [String], 
    categories: [Schema.Types.ObjectId], 
    order: Number, 
    slug: { 
     type: String, 
     validate: { 
      validator: slugExists, 
      message: 'Slug already exists, choose a different title', 
     } 
    } 
}, options); 

Ceci est la méthode qui vérifie si les données existent:

function slugExists(value) { 
    this.model.count({slug: value}, function(err, count) { 
     if (error) { 
      return err; 
     } 
     return count > 0; 
    }); 
} 

Quand je lance l'application que je reçois le message d'erreur suivant:

TypeError: this.model.count is not a function 

J'ai également essayé d'utiliser ce qui suit:

mongoose.model['portfolio'].count(...) 

mais le résultat est le même.

J'ai essayé de résoudre le problème pendant deux heures maintenant, même essayé différentes approches (par exemple le pré crochet). Mais l'ajout de la validation personnalisée directement au schéma semble être l'entrée la plus propre.

J'espère que vous avez une solution pour moi. Merci d'avance!

Jeffrey

+0

Hm ... pourquoi ne pas simplement ajouter un index 'unique' sur' slug'? Néanmoins, cette [réponse] (https://stackoverflow.com/a/14271900/1022914) pourrait vous guider quelque part. Avez-vous essayé 'mongoose.model ('portfolio'). Count (...)'? – Mikey

+0

Merci pour votre réponse Mikey. Malheureusement, les deux solutions ne fonctionnent pas. Je continue à recevoir l'erreur suivante: Impossible de lire la propriété 'count' de undefined. – Jeffrey

Répondre

0

peut utiliser la méthode pre-save Prenons l'exemple ci-dessous où essayer de valider le nom d'utilisateur dans le modèle utilisateur:

UserSchema.pre('save', function (next) { 
    var self = this; 
    mongoose.models["User"].findOne({username: self.username}, function (err, user) { 
     if (!user) { 
      next(); 
     } else { 
      next(new Error("Username already exists!")); 
     } 
    }); 
+0

Merci d'avoir trouvé une solution. Je n'ai pas envie d'utiliser le pré-crochet, parce que je dois penser à une autre façon de gérer les messages d'erreur (comme vous pouvez le voir dans mon exemple, j'utilise les messages personnalisés de Mongoose pour les erreurs). – Jeffrey

+0

En utilisant ci-dessus aussi vous obtenez les mêmes erreurs personnalisées. Vous pouvez également utiliser la fonction de crochet dans votre fonction personnalisée. –

+0

Merci pour votre réponse. Finalement, j'ai trouvé la solution que je cherchais. Pourtant, je suis curieux de savoir comment vous pouvez créer les mêmes erreurs personnalisées dans les pré-hooks. Je vais regarder dedans! – Jeffrey

0

Alors que je testais les différentes solutions que je trouve un poste qui a répondu à ma question (https://stackoverflow.com/a/26268156/8267696).

C'était la solution que je cherchais:

function slugExists(value, callback) { 
    this.constructor.count({slug: value}, function(err, count) { 
     if (err) { 
      next(err); 
     } 
     callback(count === 0); 
    }); 
} 

Portfolio.pre('validate', function(next) { 
    this.slug = slugify(this.title); 
    next(); 
}); 

Side note: La limace sera généré sur la base du titre. C'est pourquoi j'ai dû utiliser un pré-hook 'valider' pour que le slug soit déjà défini avant la validation (sinon le validateur serait ignoré, car il n'a aucune valeur et n'est pas nécessaire)