Node-express项目--个人简历:搭建posts接口并实现评论、点赞以及相关功能(1)

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

逻辑思考:

  1. 根据token可以获得当前用户id,

  2. 如果该条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测试:

取消点赞前数据库查看:

在这里插入图片描述

取消点赞:

在这里插入图片描述


评论接口

====

创建评论


功能描述:

  • 根据用户输入的post id,决定评论的是哪条post

  • 用户登录的状态下才能评论,需要使用token验证身份

  • 评论必须有文本,即text不能为空

  • 将最新评论呈现在最前面

  • 保存到数据库

//$route POST api/posts/comment/:po_id

//@desc 评论

//@access private

router.post(“/comment/:po_id”, passport.authenticate(“jwt”, { session: false }), (req, res) => {

// 验证数据格式

const { errors, isValid } = validatePostInput(req.body);

if (!isValid) {

return res.status(400).json({ errors })

}

Posts.findById(req.params.po_id)

.then(post => {

const newCom = {

user:req.user.id,

text:req.body.text,

name:req.body.name,

avatar:req.body.avatar

}

post.comments.unshift(newCom);

post.save()

.then(post=>res.json(post))

})

.catch(err => res.status(404).json({ fail: “评论失败” }))

})

postman测试:

在这里插入图片描述

取消评论


功能描述:

  • 用户需要删除某条post信息下的某条评论

  • 需要输入post的id和评论的id

  • 在用户登录状态下才能删除,且只能删除自己提交的评论

  • 默认评论id(即comment_id)是存在的

//$route DELETE api/posts/cancleComment/:po_id

//@desc 删除评论

//@access private

router.delete(“/cancleComment/:po_id/:comment_id”, passport.authenticate(“jwt”, { session: false }), (req, res) => {

Posts.findById(req.params.po_id)

.then(post => {

// 查看该评论是否是当前用户评论的,如果不是,则没有权限删除

if (post.comments.filter(comment =>

( (comment._id == req.params.comment_id)) && (comment.user.toString() === req.user.id) )

.length === 0) {

return res.status(400).json({ failed: “您没有权限删除该条评论” })

}

// 寻找该用户在comments字段中的索引值

const removeIndex = post.comments.map(comment => comment._id).indexOf(req.params.comment_id);

// 删除该评论记录

post.comments.splice(removeIndex, 1);

// 保存修改至数据库

post.save().then(post => res.status(200).json(post))

})

.catch(err => res.status(404).json({ fail: “取消评论失败” }))

})

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
splice(removeIndex, 1);

// 保存修改至数据库

post.save().then(post => res.status(200).json(post))

})

.catch(err => res.status(404).json({ fail: “取消评论失败” }))

})

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-bZEThhFI-1714941639676)]

[外链图片转存中…(img-iJmkdqNz-1714941639676)]

[外链图片转存中…(img-sztmn8mF-1714941639676)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值