Loading......
接上一篇文章后开始实现文章管理器;
文章控制器:
- 创建文章
- 获取文章
- 获取单个文章
- 获取该用户关注的所有文章
- 获取多个文章(全局文章)
- 更新文章
- 删除文章
首先实现创建文章
思路:
- 获取请求数据
- 获取内容验证
- 获取作者信息
- 创建文章
- 生成文章别名
- 存储数据
- 存储文章和标签
- 返回数据
- 优化标签、优化作者
- 返回文章、标签、作者数据
具体实现:
在 controller 和 routes 中创建文件 articles.js ;
按照思路在 controller 下的 articles.js 中逐步实现;(具体代码内容在尾部附有)
在 routes 中的 articles.js 完成路由的相关配置 ;
之后在 initRoute.js 中添加访问地址;
在工具栏创建文章创建验证;
在终端输入 npm i unique-slug 安装 slug 库,并在工具栏 utils 中的 slug.js 中引入库;
验证:
在终端启动服务 npm run dev ,利用 postman 进行验证;
验证时注意 token 值是当前登录用户返回的 token 值 ;
详细代码:
controller / articles.js:
const HttpException = require("../exceptions/http_expetion");
const { validateCreateArticle } = require("../utils/validate/article_validate");
const Article = require("../models/article");
const User = require("../models/user");
const { getSlug } = require("../utils/slug");
const Tag = require("../models/tag");
//创建文章
module.exports.createArticle = async (req, res, next) => {
try {
//获取请求数据
const { title, description, body, tags } = req.body.article
//获取内容验证
let { error, validate } = validateCreateArticle(title, description, body)
if (!validate) {
throw new HttpException(401, '文章内容不存在!!!', error)
}
//获取作者信息
const { email } = req.user
const author = await User.findByPk(email)
if (!author) {
throw new HttpException(401, '作者账号不存在!!!', 'author is not found!!!')
}
//创建文章
// 生成文章别名
let slug = getSlug()
// 存储数据:
let article = await Article.create({
slug,
title,
description,
body,
UserEmail: author.email
})
//存储文章和标签的处理
// 自定义
// 数据库已有
if (tags) {
for (const i of tags) {
let existTag = await Tag.findByPk(i)
let newTag
if (!existTag) {
newTag = await Tag.create({ name: i })
await article.addTag(newTag)
} else {
await article.addTag(existTag)
}
}
}
//返回数据 (文章、标签、作者)
article = await Article.findByPk(slug, { include: Tag }) //追加标签
//标签优化
const newTags = []
for (const i of article.dataValues.tags) {
newTags.push(i.name)
}
article.dataValues.tags = newTags
//作者优化
delete author.dataValues.password
delete author.dataValues.email
article.dataValues.author = author
res.status(201)
.json({
status: 1,
message: '创建文章成功!!!',
data: article.dataValues
})
} catch (err) {
next(err);
}
};
//获取文章:获取单个
module.exports.getArticle = async (req, res, next) => {
try {
} catch (err) {
next(err);
}
};
//获取文章:获取关注作者的多个文章
module.exports.getFollowArticle = async (req, res, next) => {
try {
} catch (err) {
next(err);
}
};
//获取文章:获取全局文章
module.exports.getArticles = async (req, res, next) => {
try {
} catch (err) {
next(err);
}
};
//更新文章
module.exports.updateArticles = async (req, res, next) => {
try {
} catch (err) {
next(err);
}
};
//删除文章
module.exports.deleteArticles = async (req, res, next) => {
try {
} catch (err) {
next(err);
}
};
routes / articles.js:
const express = require("express");
const router = express.Router()
const {authMiddleware} = require('../middleware/admin/auth_middleware')
const ArticlesController = require('../controller/articles')
router.get('/:slug',authMiddleware,ArticlesController.getArticle)
router.get('/follow',authMiddleware,ArticlesController.getFollowArticle)
router.get('/',authMiddleware,ArticlesController.getArticles)
router.post('/',authMiddleware,ArticlesController.createArticle)
router.put('/',authMiddleware,ArticlesController.updateArticles)
router.delete('/',authMiddleware,ArticlesController.deleteArticles)
module.exports = router
initRoute.js:
const userRoute = require('../routes/users')
const followRoute = require('../routes/follow')
const tagRoute = require('../routes/tags')
const articleRoute = require('../routes/articles')
const initRoute = (app)=>{
app.use('/api/v1/users',userRoute)
app.use('/api/v1/follow',followRoute)
app.use('/api/v1/tags',tagRoute)
app.use('/api/v1/articles',articleRoute)
}
module.exports = initRoute
utils / validate / article_validate.js :
const validator = require('validator')
//文章创建验证
module .exports.validateCreateArticle = (title,description,body)=>{
let err = {}
if(validator.isEmpty(title)){
err.title = '文章标题不能为空 !!!'
}
if(validator.isEmpty(description)){
err.description = '文章描述不能为空 !!!'
}
if(validator.isEmpty(body)){
err.body = '文章内容不能为空 !!!'
}
let validate = Object.keys(err).length < 1
return {err,validate}
}
utils / slug.js :
const uniqueSlug = require('unique-slug')
module.exports.getSlug =()=>{
let radomSlug = uniqueSlug()
return radomSlug
}
未完待续......