Я пытаюсь создать простой сайт, где аутентифицированные пользователи (авторы) могут писать и публиковать истории. У меня есть коллекция Author и коллекция Story, и я пытаюсь создать связи между обеими коллекциями. Я использую mon goose и метод populate / ref. Я могу успешно отобразить историю или список историй, которые содержат информацию об их авторе, но я действительно пытаюсь прикрепить список историй к их автору при отображении профиля автора. Я хочу, чтобы при посещении страницы профиля автора пользователи могли видеть список своих историй.
Я пытаюсь использовать метод populate / ref для выполнения массива, в котором будут отображаться авторы. список историй (storyList), но массив остается неутомимо пустым. При отображении страницы профиля автора я сначала использовал функцию findById, но понял, что она не работает с заполнением. Поэтому я сейчас использую функцию findOne, но с теми же результатами.
Вот моя коллекция авторов:
const mongoose = require('mongoose');
const authorSchema = mongoose.Schema({
userName: {
type: String,
required: true
},
firstName: String,
lastName: String,
authorImage: {
type: String
},
emailAddress: {
type: String,
required: true,
unique: true,
match: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
},
password: {
type: String,
required: true
},
storyList: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Story'
}]
});
module.exports = mongoose.model('Author', authorSchema, 'authors');
Вот мой маршрут для отображения страницы профиля автора:
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const Author = require('../models/author');
exports.authors_get_one = (req, res, next) => {
const username = req.params.userName;
Author.findOne(username)
.select("_id userName firstName lastName emailAddress password authorImage storyList")
.populate('storyList')
.exec()
.then(doc => {
console.log("From database", doc);
if (doc) {
res.status(200).json({
author: doc,
});
} else {
res.status(404).json({
message: 'No valid entry found for provided ID'
});
}
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
}
Вот моя схема истории
const mongoose = require('mongoose');
const storySchema = mongoose.Schema({
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Author',
},
title: {
type: String,
},
text: {
type: String,
},
language: {
type: String,
},
published: {
type: Boolean,
default: false
}
});
module.exports = mongoose.model('Story', storySchema, 'stories');
А вот мой путь создания истории:
const mongoose = require('mongoose');
const Story = require('../models/story');
const Author = require('../models/author');
exports.stories_createOne = (req, res, next) => {
const story = new Story({
title: req.body.title,
text: req.body.text,
language: req.body.language,
author: req.body.author
});
story
.save()
.then(result => {
console.log(result);
res.status(201).json({
message: "Story publiée !",
createdStory: {
_id: result._id,
title: result.title,
text: result.text,
language: result.language,
author: result.author,
}
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
});
});
}
Из найденной документации я не вижу, что Я делаю не так Я что-то здесь упускаю? Разве метод populate недостаточен для выполнения моего списка историй (storyList)? Должен ли я вообще что-то делать в моем коде и что?