#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];
но это не работает, и после целого дня поисков решения я все еще не могу найти то, что мне нужно сделать, чтобы убедиться, что мои данные сохраняются.