Мои данные не сохраняются, когда я пытаюсь создать новое событие (NodeJS / Мангуст)

#node.js #mongodb #mongoose

Вопрос:

Я изучаю узел / монго, и у меня есть 2 модели : Пользователь и событие.

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

Моя проблема проста: когда я публикую событие, я могу получить ответ именно с тем, что я хочу, но кажется, что данные все равно не сохраняются в базе данных (я не вижу их в документе и не могу сделать запрос GET на него).

Схема пользователей:

 const userSchema = new Schema(
  {
    email: { type: String, unique: true, required: true },
    pseudo: { type: String, unique: true, required: true },
    password: { type: String },
    description: { type: String },
    avatar: { type: String },
  },
  {
    timestamps: true,
  }
);
 

Схема событий:

 const eventSchema = new Schema({
  eventID: { type: Number },
  admin: [{ type: Schema.Types.ObjectId, ref: "User", default: [] }],
  participant: [{ type: String, ref: "User", default: [] }],
  visibility: { type: Boolean, default: false },
});
 

мой метод публикации:

 router.post("/", auth, async (req, res) => {
  try {
    const { error } = validate(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    let event = new Event(req.body);

    let participants = [];

    req.body.participant.forEach(async (element) => {
      await User.find({ email: element }).then((res) => {
        participants.push(res);
      });
    });

    event.participant = participants;
    await event.save();

    res.send(event);
  } catch (error) {
    console.log(error);
    res.send("An error occured");
  }
});
 

Если я сделаю запрос на публикацию, я получу такой ответ: (примечание: EventID-это поддельный идентификатор, который я создал, так как позже мне нужно будет создать свое собственное событие на основе события из другого API)

 {
    "eventID": 1223,
    "admin": [
        "613733654d2763f7d81f16fa"
    ],
    "participant": [
        [
            {
                "_id": "613728b6c8c80a671da9b8dd",
                "email": "admin@admin.fr",
                "pseudo": "admin",
                "password": "$2b$10$CCDMw50cLYysOmbHfy.r.eqAD8A6G3YqbeViH5RMjpGzUK9OOGyui",
                "createdAt": "2021-09-07T08:54:14.872Z",
                "updatedAt": "2021-09-07T08:54:14.872Z",
                "__v": 0
            }
        ]
    ],
    "visibility": true,
    "_id": "6137cef5d92e3f9fc0bac763",
    "__v": 0
}
 

So for now it’s fine but if I open the document ‘6137cef5d92e3f9fc0bac763’ this is what I have:

 {
  "_id": {
    "$oid": "6137cfd4d92e3f9fc0bac766"
  },
  "eventID": 1223,
  "admin": [
    {
      "$oid": "613733654d2763f7d81f16fa"
    }
  ],
  "participant": [],
  "visibility": true,
  "__v": 0
}
 

So of course when I try to get the event by its ID I got an error:

 router.get("/", auth, (req, res) => {
  const event = Event.find({ _id: req.body._id });
  res.send(event);
});
 
 TypeError: Converting circular structure to JSON
    --> starting at object with constructor 'Topology'
    |     property 's' -> object with constructor 'Object'
    |     property 'sessionPool' -> object with constructor 'ServerSessionPool'
    --- property 'topology' closes the circle

 

what I don’t get its if I do a console.log(participants) here:

   req.body.participant.forEach(async (element) => {
      await User.find({ email: element }).then((res) => {
        participants.push(res);
      });
    });
 

I have this result:

 [
  [
    {
      _id: new ObjectId("613728b6c8c80a671da9b8dd"),
      email: 'admin@admin.fr',
      pseudo: 'admin',
      password: '$2b$10$CCDMw50cLYysOmbHfy.r.eqAD8A6G3YqbeViH5RMjpGzUK9OOGyui',
      createdAt: 2021-09-07T08:54:14.872Z,
      updatedAt: 2021-09-07T08:54:14.872Z,
      __v: 0
    }
  ]
]
 

но если я сделаю это за пределами foreach, я получу пустой массив. Я вижу, что это многомерный массив, поэтому я попытался:

 event.participant = participants[0];
 

но это не работает, и после целого дня поисков решения я все еще не могу найти то, что мне нужно сделать, чтобы убедиться, что мои данные сохраняются.