Почему я получаю ошибку при использовании populate () в mon goose? - PullRequest
0 голосов
/ 20 апреля 2020

В моем .catch появляется следующая ошибка, и мне трудно ее выяснить:

"message": "Cast to ObjectId failed for value \"{\n  type: 'resistance',\n  name: 'Bicep Curl',\n  duration: 20,\n  weight: 100,\n  reps: 10,\n  sets: 4\n}\" at path \"_id\" for model \"Exercise\"",
"name": "CastError",
"stringValue": "\"{\n  type: 'resistance',\n  name: 'Bicep Curl',\n  duration: 20,\n  weight: 100,\n  reps: 10,\n  sets: 4\n}\"",
"value": {
"type": "resistance",
"name": "Bicep Curl",
"duration": 20,
"weight": 100,
"reps": 10,
"sets": 4
},
"path": "_id",
"reason": {}
}

Здесь много информации, поэтому я начну с самого начала.

Мне дали исходный файл, который выглядит следующим образом. Насколько я знаю, я не должен касаться этого кода:

let mongoose = require("mongoose");
let db = require("../models");

mongoose.connect("mongodb://localhost/workout", {
  useNewUrlParser: true,
  useFindAndModify: false
});

let workoutSeed = [
  {
    day: new Date().setDate(new Date().getDate()-10),
    exercises: [
      {
        type: "resistance",
        name: "Bicep Curl",
        duration: 20,
        weight: 100,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-9),
    exercises: [
      {
        type: "resistance",
        name: "Lateral Pull",
        duration: 20,
        weight: 300,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-8),
    exercises: [
      {
        type: "resistance",
        name: "Push Press",
        duration: 25,
        weight: 185,
        reps: 8,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-7),
    exercises: [
      {
        type: "cardio",
        name: "Running",
        duration: 25,
        distance: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-6),
    exercises: [
      {
        type: "resistance",
        name: "Bench Press",
        duration: 20,
        weight: 285,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-5),
    exercises: [
      {
        type: "resistance",
        name: "Bench Press",
        duration: 20,
        weight: 300,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-4),
    exercises: [
      {
        type: "resistance",
        name: "Quad Press",
        duration: 30,
        weight: 300,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-3),
    exercises: [
      {
        type: "resistance",
        name: "Bench Press",
        duration: 20,
        weight: 300,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-2),
    exercises: [
      {
        type: "resistance",
        name: "Military Press",
        duration: 20,
        weight: 300,
        reps: 10,
        sets: 4
      }
    ]
  },
  {
    day: new Date().setDate(new Date().getDate()-1),
    exercises: [
      {
        type: "resistance",
        name: "Bench",
        duration: 30,
        distance: 2
      }
    ]
  }
];

db.Workout.deleteMany({})
  .then(() => db.Workout.collection.insertMany(workoutSeed))
  .then(data => {
    console.log(data.result.n + " records inserted!");
    process.exit(0);
  })
  .catch(err => {
    console.error(err);
    process.exit(1);
  });

Я создал 2 модели на основе этого семени и, конечно, индекс. js файл.

Тренировка :

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var WorkoutSchema = new Schema({
    day: {
        type: Date,
        default: Date.now
    },
    exercises: [
        {
            type: Schema.Types.ObjectId,
            ref: "Exercise"
        }
    ]

});

const Workout = mongoose.model("Workout", WorkoutSchema);

module.exports = Workout;

Упражнение:

const mongoose = require("mongoose");

const Schema = mongoose.Schema;

const ExerciseSchema = new Schema({
    type: String,
    name: String,
    duration: Number,
    weight: Number,
    reps: Number,
    sets: Number,
    distance: Number
});

const Exercise = mongoose.model("Exercise", ExerciseSchema);

module.exports = Exercise;

Указатель. js

module.exports = {
    Workout: require("./Workout"),
    Exercise: require("./Exercise")
};

Затем я запустил следующий код, чтобы посмотреть, смогу ли я получить json используя populate:

app.get("/api/workouts", (req, res) => {
        db.Workout.find({})
            .populate("exercises")
            .then(dbWorkouts => res.json(dbWorkouts))
            .catch(err => res.json(err))
    });

Однако, это дает мне сообщение об ошибке, опубликованной в начале. Я не уверен, что понимаю, что не так. Если я удаляю populate (), я получаю пустой массив для упражнения. Я что-то упустил?

Редактировать: Кто-то сказал, чтобы попытаться заполнить ("Упражнения") и заполнить ("Упражнение"), и я получаю тот же результат, как если бы не запрограммирован populate (), который выглядит как это:

[
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a958",
"day": "2020-04-10T02:16:35.784Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a959",
"day": "2020-04-11T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a95a",
"day": "2020-04-12T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a95b",
"day": "2020-04-13T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a95c",
"day": "2020-04-14T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a95d",
"day": "2020-04-15T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a95e",
"day": "2020-04-16T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a95f",
"day": "2020-04-17T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a960",
"day": "2020-04-18T02:16:35.785Z"
},
{
"exercises": [],
"_id": "5e9d0603a58905d8f0b3a961",
"day": "2020-04-19T02:16:35.785Z"
}
]

Edit2: Поскольку я смотрю на этот код и данные в базе данных, я понимаю, что теперь, когда засевается исходный файл, вложенный документ для упражнений НЕ генерирует ObjectID ,. В этом ли проблема? Я смотрю на свою модель тренировки, на которую ссылается упражнение, и я почти уверен, что это сделано правильно. Кто-нибудь знает, если я что-то упускаю?

1 Ответ

0 голосов
/ 20 апреля 2020

Я собрал ваше приложение и смог воспроизвести ошибку. Проблема в том, что вы пытаетесь использовать заполнить что-то, что уже заполнено. Под этим я подразумеваю, что если вы посмотрите на свою базу данных, используя mon goose compass, то увидите, что в Workout уже есть все данные из Exercice. То, что вы делаете, не ссылается на идентификатор, а встраивает его. Поэтому, чтобы заставить его работать, удалите заполнение, импортируйте ExerciceSchema в файл модели тренировки, затем замените

exercises: [
    {
        type: Schema.Types.ObjectId,
        ref: "Exercise"
    }
]

на

exercises: [ExerciseSchema]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...