}
}],
avatar: {
type: String
},
comments: [{
user: {
type: Schema.Types.ObjectId,
ref: “users”
},
name: {
type: String
},
avatar: {
type: String
},
text: {
type: String,
require: true
},
date: {
type: Date,
default: Date.now()
}
}],
date: {
type: Date,
default: Date.now()
}
})
module.exports = Post = mongoose.model(“post”, postSchema);
创建路由文件
在routes/api下创建新文件post.js,作为posts接口的文件
const express = require(“express”);
const router = express.Router();
const mongoose = require(‘mongoose’);
//引入需要的表
const User = require(“…/…/module/User”);
const Profile = require(“…/…/module/Profile”);
const Posts = require(“…/…/module/Post”);
const passport = require(“passport”);
//$route GET api/posts/test
//@desc 测试post的路由是否可以正常使用
//@access public
router.get(‘/test’, (req, res) => {
res.json({ msg: “post works” })
})
// 导出路由
module.exports = router;
使用posts接口
// 引入posts接口
const posts = require(“./routes/api/post”);
// 使用中间件
app.use(“/api/posts”,posts);
路由连通性测试
postman中:
提示posts接口工作,代表路由搭建正确,可以进行后续工作
创建post信息添加接口
============
路由编写
路由文件post.js中:
-
只有登录用户才能发布post信息,并且发布的post信息与用户绑定,需要使用token验证
-
将发布的post信息保存至数据库
//$route POST api/posts
//@desc 创建post接口
//@access private
router.post(“/”, passport.authenticate(“jwt”, { session: false }), (req, res) => {
// 存储用户输入的数据
const newPost = new Posts({
user:req.user.id,
text:req.body.text,
name:req.body.name,
name:req.body.name,
avatar:req.body.avatar
})
// 将数据存储到数据库
newPost.save().then(post=>{
res.json(post)
})
.catch(err=>res.json(err))
})
验证编写
-
验证输入的数据格式,格式不正确时给出提示
-
在定义数据时,指定text字段不能为空
-
规定post信息长度不能大于300字符
在validation文件夹下新建post.js,作为评论格式的验证文件
const Validator = require(‘validator’);
const isEmpty = require(“./empty”);
module.exports = function validatePostInput(data) {
let errors = {};
//如果输入空(没有输入),需要将其改为空字符串
data.text = !isEmpty(data.text) ? data.text : ‘’;
// 长度限制
if (!Validator.isLength(data.text, { min: 2, max: 300 })) {
errors.text = “text的长度不能小于2位并且不能大于300位!”;
}
// 评论文本text不能为空
if (Validator.isEmpty(data.text)) {
errors.text = “text不能为空”;
}
return {
errors,
isValid: isEmpty(errors)
}
}
使用验证
在路由文件post.js中引入验证:
// 引入验证文件
const validatePostInput = require(“…/…/validation/post”);
在评论接口中使用验证:
// 验证数据格式
const { errors, isValid } = validatePostInput(req.body);
if (!isValid) {
return res.status(400).json({ errors })
}
postman测试
记得在Header加上未过期的token
当我没有写text但提交时(post字符不能少于2字符的验证与此类似,此处不列举)
正确提交:
此时查看数据库,可以看到,多了一个posts表,里面有刚刚提交的评论信息,刚刚提交时用的是test账号的token,因此user值是该账号的id
获取post信息
========
获取所有post信息
-
获取所有post信息并按时间降序排序,最新post信息在最前面
-
不需要绑定user,因此没有使用token认证
路由文件post.js中编写接口:
//$route GET api/posts
//@desc 获取所有post信息
//@access public
router.get(‘/’, (req, res) => {
Posts.find()
.sort({date:-1})
.then(posts=>res.json(posts))
.catch(err=>res.status(404).json({noposts:“找不到该信息”}))
})
postman测试:
为了体现按时间顺序排序,我多send了一条post信息上去
获取单条post
- 根据post_id获取post
//$route GET api/posts/:po_id
//@desc 获取单条post
//@access public
router.get(‘/:po_id’, (req, res) => {
Posts.findById(req.params.po_id)
.then(post=>res.json(post))
.catch(err=>res.status(404).json({noposts:“找不到该post信息”}))
})
postman测试:
删除单条post信息
==========
功能描述:
-
根据用户提供的post_id删除该条post
-
用户只能删除自己的post
逻辑思考:
-
根据token可以获得当前用户id,
-
如果该条post的用户id与当前用户id一致,就可以删除该post信息
//$route DELETE api/posts/:po_id
//@desc 删除单条post
//@access private
router.delete(“/:po_id”, passport.authenticate(“jwt”, { session: false }), (req, res) => {
// 用户只能删除自己的post,若该post存在,则执行删除操作
Posts.findById(req.params.po_id)
.then(post => {
if (post.user.toString() !== profile.user.toString()) {
return res.status(401).json({ notAuthented: “您没有权限删除该信息” })
}
post.remove().then(()=>res.json({success:true}))
})
.catch(err=>res.status(404).json({fail:“信息删除失败”}))
})
postman测试:
本来有这两条post,都是账号test的:
我用账号test2去删除其中一条post(即执行删除操作时使用test2的token),提示没有删除权限:
换成用账号test去删除这条post(即执行删除操作时使用test的token),删除成功:
再次查看,已经没有那条id尾号88ba的post了:
注:login登录时会返回一个token,不同的用户登录有不同的token,此处用的是JWT的token,具体可以看之前的文章:《Node-express项目–个人简历:添加token认证》,谢谢支持
点赞接口
====
创建点赞
功能描述:
-
此处点赞和取消赞是两个不同的接口,此处只实现点赞功能
-
用户点赞需要是登录状态,该接口需要token认证
-
如果没有被该用户赞过,就执行点赞操作
-
如果该用户已经赞过,提示已经点过赞了
//$route POST api/posts/like/:po_id
//@desc 点赞
//@access private
router.post(“/like/:po_id”, passport.authenticate(“jwt”, { session: false }), (req, res) => {
// 根据用户传入的id寻找评论post
Posts.findById(req.params.po_id)
.then(post => {
// 查看该评论的likes是否已经有该用户
if(post.likes.filter(like=>like.user.toString() === req.user.id).length > 0){
return res.status(400).json({haveLiked:“该用户已经点赞过”})
}
// 如果没有该用户,将用户id填入likes字段
post.likes.unshift({user:req.user.id});
// 保存至数据库
post.save().then(post=>res.status(200).json(post))
})
.catch(err=>res.status(404).json({fail:“点赞失败”}))
})
postman测试:
一开始likes字段里都没有内容:
我们用test的账号发送点赞请求(带上未过期的test账号的token),被点赞的post id为60dad3df2c58a95e14429627:
取消点赞
功能描述:
-
此处点赞和取消赞是两个不同的接口,此处只实现取消点赞功能
-
用户只能取消自己点过的赞,其他人点的赞无法取消
-
如果没有被该用户赞过,就提示还未点赞
-
如果该用户已经赞过,就执行取消点赞操作
//$route POST api/posts/cancleLike/:po_id
//@desc 取消点赞
//@access private
router.post(“/cancleLike/:po_id”, passport.authenticate(“jwt”, { session: false }), (req, res) => {
// 根据输入的评论id查找该评论
Posts.findById(req.params.po_id)
.then(post => {
// 查看该评论的likes是否已经有该用户
if (post.likes.filter(like => like.user.toString() === req.user.id).length === 0) {
return res.status(400).json({ haveLiked: “该用户还未点赞过” })
}
// 寻找该用户在likes字段中的索引值
const removeIndex = post.likes.map(like => like.user.toString()).indexOf(req.user.id);
// 删除该用户点赞记录
post.likes.splice(removeIndex, 1);
// 保存至数据库
post.save().then(post => res.status(200).json(post))
})
.catch(err => res.status(404).json({ fail: “取消点赞失败” }))
})
postman测试:
取消点赞前数据库查看:
取消点赞:
评论接口
====
创建评论
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
最后的最后
面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
需要完整面试题的朋友可以点击蓝色字体即可获取!!!
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-BogQvjyY-1711688299036)]
[外链图片转存中…(img-i4dQZ3zw-1711688299037)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-L954CKpt-1711688299037)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)
最后的最后
面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
需要完整面试题的朋友可以点击蓝色字体即可获取!!!
[外链图片转存中…(img-GxAMsloC-1711688299038)]
[外链图片转存中…(img-sUHckm7j-1711688299038)]
[外链图片转存中…(img-XTJy7MFO-1711688299038)]
[外链图片转存中…(img-pT1nEwNI-1711688299038)]