2017-06-30 13 views
0

ここに私のコードがあります。私は "review.js"と呼ばれる別のファイルにレビュースキーマを持っています。スキーマが正しくインポートされ、エクスポートされているにもかかわらず、まだ「スキーマがコンストラクタではありません」

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; 

let reviewSchema = new Schema(); 

reviewSchema.add({ 


    rating: { 
     type: Number, 
     min: 1, 
     max: 5, 
     defualt: 0 
    }, 


    howEasyToMake: { 
     type: Number, 
     required: true, 
     min: 1, 
     max: 5 
    }, 

    howGoodTaste: { 
     type: Number, 
     required: true, 
     min: 1, 
     max: 5, 
    }, 

    wouldMakeAgain: { 
     type: Number, 
     required: true, 
     min: 1, 
     max: 5, 
    }, 


    comment: { 
     type: String, 
     default: "" 
    }, 


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

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

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

    chefsCreationDate: { 
     type: Number, 
     required: true 
    }, 

    chefsId: { 
     type: String, 
     required: true 
    } 


}); 

module.exports.reviewSchema = reviewSchema; 

recipe.jsと呼ばれる別のファイルがあります。ここでreviewSchemaをインポートし、レシピモデルスキーマの埋め込みスキーマとして使用します。

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').reviewSchema; 



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: undefined 
    }, 



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

    likedBy: { 
     type: Array 

    }, 

    reviewedBy: { 
     type: Array 
    } 


}); 



recipeSchema.methods.updateReviewAverage = function(){ 

    let recipe = this; 

    this.reviewAverage = this.totalAddedRatings/this.numberOfRatings; 

}; 


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

module.exports = Recipe; 

私はその後、私のRecipe文書に埋め込まれreviewsOfRecipes配列に挿入するために、私はレビューを構築するためにreviewSchemaを使用recipeRouter.jsと呼ばれる別のファイルを持っています。私recipRouter.jsファイルで、私のコードはこれを実行しようとするたび....

Recipe.findOne({名:req.params.name})、その後((レシピ)=> {

let review_ = new reviewSchema({ 
      comment: req.body.comment 
      rating: req.body.score 
     }); 

    recipe.reviewsOfRecipe.push(review_); 

}

...このエラーが発生します。

これまで私がこの問題に遭遇したとき、レシピモデルスキーマと同じファイルにreviewSchemaがありました。それ以来、私は2つをそれぞれのファイルを持つものに分割しました。そして、ファイルにmodule.exports.reviewSchema = reviewSchema;を正しくエクスポートして、recipe.jsrecipeRouter.jsファイルの両方にconst reviewSchema = require('../model/review').reviewSchema;が含まれていることを確認しました。しかし、まだこの問題は起きている/誰かが問題であるかもしれないことを指摘できるなら、私は非常に感謝するだろう。

+0

あなたはそのようなインスタンスを作成しないでください。代わりに 'recipe.reviewsOfRecipe.push({comment:req.body.comment、rating:req.body.score})'を実行してください。 mongooseのドキュメントのページの一番下にある[sub-docs](http://mongoosejs.com/docs/subdocs.html)を見てください。さらに、 '' $ push'(https: //docs.mongodb.com/manual/reference/operator/update/push/)演算子を使用すると、ドキュメントを取得して配列に追加するのではなく、サーバー上の既存ドキュメントの配列に追加することができます。 –

答えて

1

あなたは(mongoose.modelを使用して)他のスキーマに行ったようreviewSchemaをエクスポートする必要があります。

module.exports.reviewSchema = mongoose.model('Review', reviewSchema); 
関連する問題