使用koa+mongodb构建的仿知乎接口(三)

好了,今天要实现的需求是什么呢?一个社区一般必定会有关注他人、取消关注或者被他人关注的需求。所以,我们就以知乎上的关注、取消关注、正在关注列表、粉丝列表为原型进行开发。


关注和取消关注

  1. 继续增加UserSchema中的字段
const UserSchema = new Schema({
  ...,
  following: {
    type: [{type: Schema.Types.ObjectId, ref: 'User'}],
    select: false
  }
})
  1. 编写转发的路由
// 关注谁
router.put('/follow/:id', auth, follow)
// 取消关注谁
router.delete('/unfollow/:id', auth, unfollow)
  1. 使用数据模型编写控制器逻辑
async follow (ctx) {
  const me = await User.findById(ctx.state.user._id).select('+following');
  if (!me.following.map(id => id.toString()).includes(ctx.params.id)) {
    me.following.push(ctx.params.id);
    me.save();
  }
  ctx.status = 204;
}
async unfollow (ctx) {
  let user = await User.findById(ctx.state.user._id).select('+following')
  let index = user.following.map(id=>id.toString()).indexOf(ctx.params.id)
  if(index > -1) {
    user.following.splice(index)
    user.save()
  }
  ctx.status = 204
}
  1. 使用Postman测试

获取粉丝列表和正在关注列表

  1. 编写转发的路由
// 谁的粉丝
router.get('/:id/listenFollower', listenFollower)
// 谁关注了什么人
router.get('/:id/listenFollowing', listenFollowing)
  1. 使用数据模型编写控制器逻辑
async listenFollowing (ctx) {
  let user = await User.findById(ctx.params.id).select('+following').populate('following')
  if (!user) {ctx.throw(404)}
  ctx.body = user.following
}
async listenFollower(ctx) {
  const users = await User.find({following: ctx.params.id})
  ctx.body = users
}
  1. 使用Postman测试

总结:

1.用户关注和取消关注,是需要鉴权的过程的。

原文地址:https://www.cnblogs.com/Jomsou/p/12507577.html

时间: 2024-10-11 13:31:17

使用koa+mongodb构建的仿知乎接口(三)的相关文章

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

Drawer Arrow Drawable(meun-icon-to-back-arrow)使用,仿知乎菜单栏界面

Drawer Arrow Drawable(meun-icon-to-back-arrow)使用,仿知乎菜单栏界面 一.什么是Drawer Arrow Drawable Drawer Arrow Drawable 其实就是一个抽屉侧滑菜单栏,只不过加入了很酷炫的meun-icon-to-back-arrow动画效果,如下图所示 二.Drawer Arrow Drawable的实现原理 设计方法: 我的想法是:如果我能生成每条线末端的移动曲线,我就能随抽屉(drawer)的滑动,根据参数t简单地计

仿知乎日报学习笔记与优化

仿知乎日报学习笔记与优化项目原地址(有些小BUG):单页网页应用:https://github.com/pomelo-chuan/Zhihu-Daily-Vue.js知乎日报api查询:https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90如果想看完整的API的json数据的话,推荐使用sublime,网上搜索sublime jso

如何构建日均千万PV Web站点 (三) Sharding

     其实国内许多大型网站为了应对日益复杂的业务场景,通过使用分而治之的手段将整个网站业务分成不同的产品线,比如说国内那些大型购物交易网站它们都将自己的网站首页.商铺.订单.买家.卖家等拆分不同的产品线,分归不同的业务团队负责: 集体到技术,也会根据产品线划分,将一个网站拆分成许多不同的应用,每个应用用独立部署维护.应用之间可以通过一个超链接建立关系(在首页上的导航链接每个都指向不同的应用地址),也可以通过消息队列进行数据分发,当然最多的还是通过访问同一个数据库存储系统来构成一个关联的完整系

终于拿到《构建高可用Linux器(第三版)》样书了

从知道<构建高可用Linux器(第三版)>即将出版上市到拿到样书,确实等了不少天,终于拿到<构建高可用Linux器(第三版)>样书了,从酝酿出书的第一版到如今的第三版,五年心血,几终易稿,个中心酸只有自知,对自己也算是有个交待了.

Android 仿PhotoShop调色板应用(三) 主体界面绘制

版权声明:本文为博主原创文章,未经博主允许不得转载. Android 仿PhotoShop调色板应用(三) 主体界面绘制    关于PhotoShop调色板应用的实现我总结了两个最核心的部分:   1. 主体界面不同区域的绘制   2. 颜色选择的生成与交互 这里我讲述一下第一要点,也就是ColorPickerDialog对主体界面的绘制. 首先还是看一下ColorPickerDialog整体显示的效果(见图1)     图1 对应着效果图我画了一张界面结构分析图,相信看了之后会对该界面的组成很

已知圆上三个点坐标,求圆半径 r 和 圆心坐标

问题: 已知圆上三个点坐标分别为(x1,y1).(x2,y2).(x3,y3) 求圆半径R和圆心坐标(X,Y) X,Y,R为未知数,x1,y1,x2,y2,x3,y3为常数 则由圆公式:(x1-X)²+(y1-Y)²=R²      (1)式(x2-X)²+(y2-Y)²=R²      (2)式(x3-X)²+(y3-Y)²=R²      (3)式(1)-(2),就是左边减左边,右边减右边,得到x1²-2Xx1+X²+(y1²-2Yy1+Y²)-(x2²-2Xx2+X²)-(y2²-2Yy2

servlet必知细节(三)-- DefaultServlet

servlet必知细节(三)-- DefaultServlet 缺省servlet:org.apache.catalina.servlets.DefaultServlet,作用是处理其他servlet处理不到的请求 我们知道,在我们工程的web.xml中,会配置servlet映射,但是有些访问无法找到映射,如一些静态图片,一些js文件等,那服务器是如何返回给客户端的呢? 要回答上面的问题,我们必须详细了解下DefaultServlet,下面我们看tomcat的官方解释. 1.什么是Default

React + Koa + Mysql 构建个人博客

前言 由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react.数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的.react-router.koa.mysql 都是从0开始接触开发的,期间遇到过很多问题,印象最深的是 react-router 参考官方文档配置的,楞是跑不起来,花费了好几个小时,最后才发现看的文档是v1.0, 而项目中是v4.3, 好在可参考的资料比较多,问题都迎刃而解了. 博客介绍 前端项目通过