Привет всем, добро пожаловать в сквозной проект полного стека (бэкэнд, фронтенд) с искусственным интеллектом и машинным обучением и серией этических хакеров. В этом посте мы собираемся добавить дополнительные функции в наш ранее созданный API.
В предыдущем посте мы настроили и создали расширенный RESTFUL API с использованием Node.js, а в конце поста я упоминаю, что мы добавим в наш API еще две функции, которые позволят пользователям добавлять комментарии к сообщению и разрешить им для загрузки изображений с локального компьютера, но вместо добавления этих двух функций, в этом посте мы добавим только перо комментария, чтобы позволить пользователям добавлять комментарий к целевому посту. Так же, как и раньше, чтобы упростить задачу, давайте разобьем процесс на части и запишем в точечной форме.
Первая часть разработки серверной части:
Ссылка на серию:
Что вы узнаете?
- Создание схем базы данных
- Создавайте различные типы маршрутов
- Заполнение схем базы данных с использованием виртуальных машин мангуста
- Глубокая популяция мангустов
- Тестировать API
Функции которые мы собираемся реализовать:
- Разрешить пользователям добавлять комментарий к целевому сообщению
- Получить комментарии к посту (заполнить)
- Получить оба сообщения, комментарии при запросе пользователя
Этапы, которые вы должны выполнить:
- Создать схему данных комментариев
- Создать маршрут для добавления комментария
- Обновите Post Schema с виртуалами, чтобы заполнить комментарии
- Заполнить нужные маршруты комментариями (маршруты, которые получают /posts)
- Протестировать API
- "Заключение"
Примечание. Опять же, я надеюсь, что вы завершили предыдущее сообщение (часть 1), так как это продолжение, вы должны завершить API до этого момента. Сказав это, давайте начнем с этого урока.
Создать схему данных комментариев
Создайте файл с именем Comment.js в папке моделей. Мы собираемся создать схему данных внутри этого файла. У нас будет 3 поля ввода данных:
Postid: идентификатор сообщения, к которому вы хотите добавить комментарий
Userid: идентификатор пользователь, разместивший комментарий
Комментарий: комментарий (строка)
/models/Comment.js
const mongoose = require('mongoose'); let CommentSchema = new mongoose.Schema({ PostId: { type: mongoose.Schema.Types.ObjectId, ref: 'post', required: true }, UserId: { type: mongoose.Schema.Types.ObjectId, ref: 'user', required: true }, comment: { type: String, required: true } }) module.exports = mongoose.model('comment', CommentSchema)
Создать маршрут для добавления комментария
Откройте файл functions.js внутри папки маршрутов. Здесь мы создадим маршрут для добавления комментария в конец файла перед экспортом маршрутизатора, а также убедитесь, что вы импортируете модель комментариев в верхнюю часть файла функций. (так же, как вы импортировали другие модели)
/post/comment/:id: запрос POST, который примет комментарий в виде строки и добавит в базу данных идентификатор целевого сообщения и идентификатор вошедшего в систему пользователя. Идентификатор сообщения — это «:id» в URL-адресе.
/routes/features.js
// GET | /api/v1/post/comment/:id| Private | add a comment to a post router.post('/post/comment/:id', verifyAuth,async (req, res) => { try { const comment = await Comment.create({ PostId: req.params.id, comment: req.body.comment, UserId: req.user.id, }) if (!comment) { return res.status(400).json({ success: false }) } res.status(200).json({ data: comment, success: true }) } catch (err) { console.log(err) res.status(400).json({success: false}) } }) module.exports = router
Обновить схему публикации
Теперь нам нужно добавить виртуальные объекты в схему данных поста, чтобы получить комментарии, связанные с постом, при получении поста. Для этого откройте файл Post.js в папке моделей и добавьте следующую функцию для создания виртуалов.
/models/Post.js
PostSchema.virtual('comments', { ref: 'comment', localField: '_id', foreignField: 'PostId', justOne: false }) module.exports = mongoose.model('post', PostSchema)
Заполните необходимые маршруты
Теперь нам нужно заполнить некоторые маршруты комментариями, чтобы мы могли получать комментарии с запросами.
Маршруты, которые мы собираемся обновить
/user: чтобы мы могли получать сообщения и комментарии с сообщениями вошедшего в систему пользователя. (глубокое заполнение)
/profile/:id: получение сообщений и комментариев к сообщениям целевого пользователя (глубокое заполнение)
/posts : получить все сообщения и комментарии к сообщениям
/followers-posts: получить все сообщения от подписчиков и комментариев к сообщениям
/post/: id: получить одно сообщение и комментарии к целевому сообщению
Посмотрим, как изменится код
/пользователь — auth.js
router.get('/user', verifyAuth, async (req, res) => { try { const user = await User.findById(req.user.id).populate({ // deep populate path: 'posts', populate : { path : 'comments' } }) res.status(200).json({ user, success: true }) } catch (err) { console.error(err.message) res.status(500).json({ msg:'SERVER ERROR'}) } })
/profile/:id — features.js
router.get('/profile/:id', async (req, res) => { try { const user = await User.findById(req.params.id).populate({ // deep populate path: 'posts', populate : { path : 'comments' } }) if(!user){ return res.status(401).json({success: false}) } res.status(200).json({ data: user, success: true }) } catch (err) { console.log(err) res.status(400).json({success: false}) } })
/posts — posts.js
router.get('/posts', async (req, res) => { try { // populate const posts = await Post.find().populate('comments').populate('posted_by') return res.status(200).json({ data: posts, success: true }) } catch (error) { console.log(err) res.status(400).json({success: false}) } })
/followers-posts — posts.js
router.get('/followers-posts', verifyAuth, async (req, res) => { try { const get_user = await User.findById(req.user.id) // populate const posts = await Post.find({UserId: get_user.following}).populate('comments').populate('posted_by') res.status(200).json({ data: posts, success: true }) } catch (err) { console.log(err) res.status(400).json({success: false}) } })
/post/:id — posts.js
router.get('/post/:id', async (req, res) => { try { // populate const post = await Post.findById(req.params.id).populate('comments') if(!post){ res.status(400).json({success: false}) } res.status(200).json({ data: post, success: true }) } catch (err) { console.log(err) res.status(400).json({success: false}) } })
Протестируйте API
Теперь, когда мы успешно добавили перо комментариев в API, давайте протестируем API с помощью postman.
/login
Войдите как joey, помните, что мы создали этого пользователя в предыдущем посте
/post/comment/:id
Используйте токен, который вы получили от joey login, и настройте заголовки URL-адреса добавления комментария, создайте данные JSON в теле и выполните POST просьба. :id должен быть идентификатором целевого сообщения.
Мы видим, что успешно добавили комментарий к целевому сообщению.
/user
Попросите пользователя joey проверить, выполняется ли заполнение. Если это работает, мы должны иметь возможность видеть сообщения, размещенные пользователем, и добавленные комментарии к каждому сообщению.
Здесь мы можем видеть как массив сообщений с сообщением, так и массив комментариев к сообщениям.
Заключение
Ура!.. Мы успешно добавили и протестировали новое перо в API
Отлично, это конец этой версии внутреннего API. Надеюсь, вам понравилось. Мы можем снова обновить серверную часть, как только начнем добавлять модели машинного обучения, поэтому, надеюсь, в следующий раз мы будем создавать интерфейс для API. И снова, если вы, ребята (читатели), хотите, чтобы я внес какие-либо изменения, пожалуйста, дайте мне знать, я постараюсь сделать все возможное, чтобы реализовать это.
ссылка на репозиторий github:https://github.com/nafiu-dev/full_stack_app_with_AI-ML_models/tree/backend_v2
Вы можете связаться со мной здесь:
https://www.instagram.com/nafiu.dev
Linkedin: https://www.linkedin.com/in/nafiu-nizar-93a16720b
Другие мои публикации