2017-07-05 2 views
0

Voici mon fichier recipe.js ...Ma méthode statique ne fonctionne pas

const express = require('express'); 
const mongoose = require('mongoose'); 
const User = require('../model/user'); 
require('mongoose-currency').loadType(mongoose); 
const Currency = mongoose.Types.Currency; 
const Schema = mongoose.Schema; 
const reviewSchema = require('../model/review'); 



let recipeSchema = new Schema({ 

    name: { 
    type: String, 
    required: true 
    }, 

    description: { 
    type: String, 
    }, 

    steps: { 
    type: String, 
    required: true, 
    }, 

    ingredients: { 
    type: Array, 
    default: ['1', '2', '3', '4'] 
    }, 

    category: { 
    type: String, 
    required: true, 
    index: true 
    }, 

    postedBy: { 
    type: String, 
    required: true, 
    }, 


    reviewsOfRecipe: [reviewSchema], 

    numberOfRatings: { 
    type: Number, 
    default: 0 
    }, 

    totalAddedRatings: { 
     type: Number, 
     default: 0 
    }, 

    reviewAverage: { 
     type: Number, 
     default: 0 
    }, 

    postersCreationDate: { 
    type: Number, 
    index: true 
    }, 

    likedBy: { 
     type: Array 

    }, 

    reviewedBy: { 
     type: Array 
    } 


}); 

// Here is my static method 

recipeSchema.methods.calculateAverage = function(){ 

    let recipe = this; 

    if (recipe.numberOfRatings === 0 && recipe.totalAddedRatings === 0){ 
    recipe.reviewAverage = 0; 
    } 
    else { 


    recipe.reviewAverage = recipe.totalAddedRatings/recipe.numberOfRatings 


    } 


}; 



let Recipe = mongoose.model('Recipe', recipeSchema); 

module.exports = Recipe; 

Dans mon fichier routeur, chaque fois qu'un utilisateur soumet un commentaire pour une recette, les champs numberOfRatings et totalAddedRatings incrémentée. Et après leur incrémentation, ma méthode statique calculateAverage doit exécuter et mettre à jour le document.

Voici à quoi il ressemble dans mon code:

Recipe.findOneAndUpdate({_id: recipe._id, postersCreationDate: recipe.postersCreationDate},{$inc: {numberOfRatings: 1, totalAddedRatings: reviewScore}}, {returnNewDocument: true}).then((recipe) => { 

       recipe.calculateAverage(); 
}); 

Cependant, chaque fois qu'un utilisateur soumet une critique, bien que numberOfRatings et numberOfRatings incrémentée en conséquence, reviewAverage ne fonctionne pas.

Je pense à la place reviewAverage comme un champ virtuel à la place; mais je crains que cela ne rende plus difficile et inefficace de trier les recettes selon les moyennes les plus élevées et les plus basses.

Répondre

0

d'abord certaines choses à propos de votre findOneAndUpdate peuvent changer. Id devrait être suffisant pour trouver par et 'returnNewDocument' n'est pas une option. En mangouste il est juste « nouvelle »

Recipe.findOneAndUpdate({_id: recipe._id},{$inc: {numberOfRatings: 1, totalAddedRatings: reviewScore}}, {new: true}).then((recipe) => { 
    recipe.calculateAverage(); 
}); 

Le problème est que vous ne sauvegardez pas la moyenne de la recette.

recipeSchema.methods.calculateAverage = function(callback) { 
    let recipe = this; 
    if (recipe.numberOfRatings === 0 && recipe.totalAddedRatings === 0) { 
     recipe.reviewAverage = 0; 
    } 
    else { 
     recipe.reviewAverage = recipe.totalAddedRatings/recipe.numberOfRatings 
    } 
    recipe.save(callback); 
}; 
+0

Je bricoler avec elle, et il est toujours en supposant que les deux '' numberOfRatings' et totalAddedRatings' sont nuls en dépit d'être incrémentée, alors je reçois encore « reviewAverage' étant encore zéro. – MountainSlayer

+0

Il s'avère que les hooks de pré-sauvegarde ne sont pas exécutés sur findOneAndUpdate() je vais changer ma réponse – Ero