Не удается прочитать свойство «push» из неопределенного при создании данных в mongoose - PullRequest
0 голосов
/ 23 декабря 2018

Я создаю приложение express.js и создал базу данных в mongoose для целей тестирования.база данных находится внутри function seedDB(), который я экспортирую в файл app.js.Создание исходной базы данных не имеет ошибки, но когда я добавляю новый «обзор» внутри этих данных.он говорит cannot read property "push" of undefined, хотя моя модель мангусты установлена ​​правильно.

У меня есть две коллекции внутри mongoDB, называемые "туры" и "обзоры". Я попытался просмотреть туры внутри оболочки Монго с помощью db.tours.find() и я обнаружил, что мой «обзор», представляющий собой массив, связанный с коллекцией отзывов, настроен правильно.Но когда я посмотрел вверх db.reviews.find ().Он также есть, но он дает результат примерно в 4 раза, что мой ожидаемый результат.

Я попытался проверить, не забыл ли я скобки, фигурная скобка, но думаю, что это не проблема.Я также пытался смотреть на мои модели снова и снова и снова менять, но также нет проблем

const tours = require("./models/tours");
const Review = require('./models/reviews');

let tourData = [{
image: "image.jpg",
place: "Place",
name: "name",
description: "this is a description",
price: 1234,
info: "this is a great tour"},
{
image: "image.jpg",
place: "Place",
name: "name",
description: "this is a description",
price: 1234,
info: "this is a great tour"},
{
image: "image.jpg",
place: "Place",
name: "name",
description: "this is a description",
price: 1234,
info: "this is a great tour"},
]

function seedDB(){
tours.deleteMany({}, (err)=>{
    if(err){
        console.log(err);
    }
    console.log("removed tours!");
        //add a few tours
        tourData.forEach(function(seeds){
            tours.create(seeds, (err, data)=> {
                if(err){
                    console.log(err)
                } else {
                    console.log('added all tours!');
                    //create a comment
                    Review.create(
                        {
                        text: "this place is great! ",
                        author: "Arnold"
                        }, (err, comment)=> {
                        if(err){
                            console.log(err)
                        } else {
                            tours.reviews.push(comment); //why is this undefined? I set it up correctly
                            tours.save();
                            console.log("created new review")
                        }
                    });
                }
            });
        });
});
};

module.exports = seedDB

, пока console.log('added all tours!'); все идет хорошо, но когда я поставил Review.create(), теперь он имеет ошибкув частности модель tours.reviews.push(comment);

//tours.js model
const mongoose = require('mongoose');

var ToursSchema = new mongoose.Schema({
image: String,
place: String,
name: String,
description: String,
price: Number,
info: String,
creator: {
  id: {
     type: mongoose.Schema.Types.ObjectId,
     ref: "User"
  },
  username: String
},
reviews:[
  {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Review"
  }
]
 });


let Tours = mongoose.model('Tour', ToursSchema);

 module.exports = Tours;

reviews.js

  const mongoose = require('mongoose');

var reviewSchema = mongoose.Schema({ //I also tried doing new Mongoose.Schema({
text: String,
author: String
  });

  module.exports = mongoose.model('Review', reviewSchema);

ожидаемые результаты в консоли должны составлять

 removed tours!
 added all tours!
 added all tours!
 added all tours!
 created new review
 created new review
 created new review

, а фактические результаты в базе данных mongoесть array of reviews внутри tours collections.

1 Ответ

0 голосов
/ 23 декабря 2018

Несколько вещей:

  1. tours это ваша модель, а не ваш экземпляр.Вы хотите нажать на обзоры одного или всех ваших экземпляров, который в вашем случае data.Так что в вашем случае вы можете сделать что-то вроде data[0].reviews.push(comment).Я вижу, как вы перепутали эту интуицию, поскольку tours является строчным, что делает его похожим на экземпляр, а не на модель.

  2. Имя второй худшей переменной после datais data2: -P

  3. Подумайте о замене обратного вызова гораздо более простым для чтения и поддержки синтаксиса асинхронного / ожидающего

  4. ненапрямую запрашивайте ваши модели, но лучше зарегистрируйте свои модели и используйте mongoose.model ('tours')

...