手把手教你用koa写项目接口

606 阅读3分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

前一篇我们封装了验证权限工具,发表动态(增删改查)

今天我们做评论和回复评论功能

graph TD
评论 --> 验证登录 --> 获取要评论动态的id,用户id --> 发表评论 --> 获取当前文章下面的评论的id,然后进行评论

创建对应的表comment

CREATE TABLE IF NOT EXISTS `comment`(
	id INT PRIMARY KEY AUTO_INCREMENT,
	content VARCHAR(1000) NOT NULL,
	moment_id INT NOT NULL,   //文章id
	user_id INT NOT NULL,     //用户id
	comment_id INT DEFAULT NULL,  //回复的id
	createAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
	updateAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
	
	FOREIGN KEY(moment_id) REFERENCES moment(id) ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY(comment_id) REFERENCES comment(id) ON DELETE CASCADE ON UPDATE CASCADE
);

发表评论

const Router = require("koa-router");

const commnetRouter = new Router({ prefix: "/commnet" });

const { 
    verifyAuth,       //判断是否登录
    verifyPermission  //验证权限
} = require("../middleware/auth.middleware");

const {
    create
} = require("../controller/comment.controller.js");

commnetRouter.post("/", verifyAuth(comment), create);    //发表评论

module.exports = commnetRouter;

要获取到评论的内容,用户的id,评论动态的id

//comment.controller.js

class CommentController {
  async create(ctx, next) {
    const { momentId, content } = ctx.request.body;
    const { id } = ctx.user;

    const result = await service.create(momentId, content, id);

    ctx.body = result;
  }
  
}
module.exports = new CommentController();

将获取到评论的内容,用户的id,评论动态的id,传入到数据库中

//comment.service.js

const connection = require("../app/database");

class CommentService {
  async create(commentId, content, userId) {
    const statement = `INSERT INTO comment (content, moment_id, user_id) VALUES (?, ?, ?)`;

    const [result] = await connection.execute(statement, [
      content,
      commentId,
      userId,
    ]);

    return result;
  }

}
module.exports = new CommentService();

测试

image.png

获取评论

const Router = require("koa-router");

const commnetRouter = new Router({ prefix: "/commnet" });

const {
    list
} = require("../controller/comment.controller.js");

commentRouter.get("/", list)    //获取评论

module.exports = commnetRouter;

要获取文章的id

//comment.controller.js

class CommentController {
  async list(ctx, next) {
    const { commentId } = ctx.query;
    
    const result = await service.getCommentsByMomentId(commentId);

    ctx.body = result;
  }
}
module.exports = new CommentController();

将获取到文章id,传入到数据库,进行查询

//comment.service.js

const connection = require("../app/database");

class CommentService {
  async getCommentsByMomentId(commentId) {
    const statement = `
    SELECT 
      m.id, m.content, m.comment_id commentId, m.createAt createTime,
      JSON_OBJECT('id', u.id, 'name', u.name) user
    FROM comment m
    LEFT JOIN user u ON u.id = m.user_id   //这里要连接用户表,查询是那些用户发表了评论
    WHERE moment_id = ?
    `;

    const [result] = await connection.execute(statement, [commentId]);

    return result;
  }
}
module.exports = new CommentService();

测试

image.png

回复评论

const Router = require("koa-router");

const commnetRouter = new Router({ prefix: "/commnet" });

const { 
    verifyAuth,       //判断是否登录
} = require("../middleware/auth.middleware");

const {
    reply
} = require("../controller/comment.controller.js");

commentRouter.post('/:commentId/reply', verifyAuth, reply)    //回复评论

module.exports = commnetRouter;

获取评论文章id,用户id,回复评论内容,要回复的评论的id

//comment.controller.js

class CommentController {
  async reply(ctx, next) {
    const { momentId, content } = ctx.request.body;
    const { commentId } = ctx.params;
    const { id } = ctx.user;

    const result = await service.reply(momentId, content, id, commentId);

    ctx.body = result;
  }
}
module.exports = new CommentController();

将获取评论文章id,用户id,回复评论内容,要回复的评论的id,传入到数据库,进行查询

//comment.service.js

const connection = require("../app/database");

class CommentService {
  async reply(momentId, content, userId, commentId) {
    try {
      const statement = `
      INSERT INTO comment (content, moment_id, user_id, comment_id) VALUES (?, ?, ?, ?)
      `;

      const [result] = await connection.execute(statement, [content,commentId,userId,momentId]);

      return result;
    } catch (error) {
      console.log(error);
    }
  }
}
module.exports = new CommentService();

测试

image.png

修改评论

const Router = require("koa-router");

const commnetRouter = new Router({ prefix: "/commnet" });

const { 
    verifyAuth,       //判断是否登录
    verifyPermission  //验证权限
} = require("../middleware/auth.middleware");

const {
    update
} = require("../controller/comment.controller.js");

commentRouter.patch('/:commentId',verifyAuth,verifyPermission(comment), update)    //修改评论

module.exports = commnetRouter;

获取修改内容,评论id

//comment.controller.js

class CommentController {
  async update(ctx, next) {
    const { commentId } = ctx.params;
    const { content } = ctx.request.body;

    const result = await service.update(commentId, content);

    ctx.body = result;
  }
}
module.exports = new CommentController();

将数据传入到数据库,并修改

//comment.service.js

const connection = require("../app/database");

class CommentService {
  async update(commentId, content) {
    try {
      const statement = `UPDATE comment SET content = ? WHERE id = ?`;
      const [result] = await connection.execute(statement, [
        content,
        commentId,
      ]);

      return result;
    } catch (err) {
      console.log(err);
    }
  }
}
module.exports = new CommentService();

测试

image.png

删除评论

const Router = require("koa-router");

const commnetRouter = new Router({ prefix: "/commnet" });

const { 
    verifyAuth,       //判断是否登录
    verifyPermission  //验证权限
} = require("../middleware/auth.middleware");

const {
    remove
} = require("../controller/comment.controller.js");

commentRouter.delete("/:commentId",verifyAuth,verifyPermission, remove )    //删除评论

module.exports = commnetRouter;

获取要删除的评论id

//comment.controller.js

class CommentController {
 async remove(ctx, next) {
    const { commentId } = ctx.params;

    const result = await service.remove(commentId);

    ctx.body = result;
  }
}
module.exports = new CommentController();

将数据传入到数据库,并修改

//comment.service.js

const connection = require("../app/database");

class CommentService {
  async remove(commentId) {
    try {
      const statement = `DELETE FROM comment WHERE id = ?`
      const [result] = await connection.execute(statement, [commentId])
      return result

    } catch (error) {
      console.log(error);
    }
  }
}
module.exports = new CommentService();

测试

image.png

写接口的的流程

graph TD
创建路由 --> 验证中间件 --> 拿到数据进行处理 --> 传入数据库 --> 将结果返回给 --> 拿到最后的结果,然后返回给前端

项目地址