85 # koa 使用 koa-router 以及 koa-views 实现路由视图逻辑分离

mvc

  • model 数据
  • view 视图
  • controller 控制器

下面实现一个路由视图逻辑分离例子,先安装依赖

npm init -y
npm i koa koa-static koa-bodyparser koa-router koa-combine-routers ejs koa-views@6.2.3

没有分离的时候,路由视图逻辑都是混在一起的

const Koa = require("koa");
const Router = require("koa-router");const app = new Koa();
const router = new Router();router.get("/", async (ctx, next) => {ctx.body = "hello";
});router.post("/add", async (ctx, next) => {ctx.body = "add";
});// 使用路由中间件
app.use(router.routes()).use(router.allowedMethods()); // 路由的装载app.listen(3000);

加了router.allowedMethods() 中间件情况下,如果接口是 get 请求,而前端使用 post 请求,会返回 405 Method Not Allowed,提示方法不被允许 ,并在响应头有添加允许的请求方式(Allow: POST);而在不加这个中间件这种情况下,则会返回 404 Not Found 找不到请求地址,并且响应头没有添加允许的请求方式 。

下面进行分离,文件结构如下

在这里插入图片描述
先看路由 routes 文件夹

articleRouter.js

let Router = require("koa-router");
let ArticleController = require("../controller/articleController");
let article = new ArticleController();const router = new Router({prefix: "/article" // 划分路由作用域
});router.get("/add", article.add);
router.get("/remove", article.remove);module.exports = router;

userRouter.js

let Router = require("koa-router");
let UserController = require("../controller/userController");
let user = new UserController();const router = new Router({prefix: "/user" // 划分路由作用域
});router.get("/add", user.add);
router.get("/remove", user.remove);module.exports = router;

index.js,合并路由可以使用 koa-combine-routers,能将多个路由合并成一个路由使用 (跟 redux 里的 combineReducers 类似)

// 整合路由
let combineRoutes = require("koa-combine-routers");let artilceRouter = require("./articleRouter");
let userRouter = require("./userRouter");module.exports = combineRoutes(artilceRouter, userRouter);

命中路径后,调用对应的控制器 controller 来处理

articleController.js

class ArticleController {async add(ctx, next) {ctx.body = "文章添加";}async remove(ctx, next) {ctx.body = "文章删除";}
}
module.exports = ArticleController;

userController.js

class userController {async add(ctx, next) {await ctx.render("index.html", {name: "kaimo",age: 313});}async remove(ctx, next) {ctx.body = "用户删除";}
}
module.exports = userController;

最后就是视图:index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><%=name%><%=age%></body>
</html>

入口,index.js,分离之后的写法如下

const Koa = require("koa");
const views = require("koa-views");
const app = new Koa();
const router = require("./routes/index");// 该中间件会在 ctx 上加上 render 方法 await ctx.render()
app.use(views(__dirname + "/views", {map: {html: "ejs" // 内部会自动引入 ejs 模块}})
);
app.use(router());app.listen(3000);

启动服务,访问 http://localhost:3000/user/add

nodemon index.js

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/108344.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux常用命令】

一、防火墙相关 1、查看防火墙状态 systemctl status flrewalld2、如果防火墙是开启状态的&#xff0c;需要关闭 systemctl stop firewalld3、永久行关闭操作&#xff08;禁止开机自启动&#xff09; 因为防火默认是开启状态的&#xff0c;如果只是手动关闭&#xff0c;先次…

《机器学习核心算法》分类算法 - 朴素贝叶斯 MultinomialNB

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 朴素贝叶斯 1、朴素贝叶斯API2、朴素贝叶斯算法实际应用2.1、获取数据集2.2、划分…

Java笔记042-反射章节练习

反射章节练习 练习1&#xff1a;通过反射修改私有成员变量 定义PrivateTest类&#xff0c;有私有name属性&#xff0c;并且属性值为helloKitty提供getName的公有方法创建PrivateTest的类&#xff0c;利用Class类得到私有的name属性&#xff0c;修改私有的name属性值&#xff…

算法 数据结构 递归冒泡算法 java冒泡算法 优化递归冒泡 数据结构(九)

使用递归算法实现冒泡&#xff1a; package com.nami.algorithm.study.day06;import java.util.Arrays;/*** beyond u self and trust u self.** Author: lbc* Date: 2023-09-05 15:36* email: 594599620qq.com* Description: keep coding*/ public class BubbleSort2 {// p…

Java项目---图片服务器

图片服务器--->服务器&#xff08;图床&#xff09; 核心功能&#xff1a;上传图片、展示图片等 比如&#xff1a;编写博客时我们会插入图片&#xff0c;本质上是往文章中放了一个链接&#xff08;URL&#xff09;&#xff0c;这个URL资源在另外一个服务器上。 核心知识点…

关闭训练过程中的wandb

训练的过程中反复提醒wandb的账户&#xff0c;自动化执行的话&#xff0c;不是很方便&#xff0c;因此需要关闭这个wandb的功能 提醒的方式是这样的&#xff1a; 解决办法1、注释掉wandb相关的代码&#xff0c;并且添加关闭命令&#xff1a;wandb None 参考&#xff1a; 训…

Redis使用原生命令搭建集群

1.Redis版本及下载 找到安装的redis版本&#xff0c;redis3.0以上版本才支持集群 下载对应的版本 2.安装redis集群 解压上传编译 [hadoophost152 opensource]$ tar -xvf redis-3.2.11.tar.gz [hadoophost152 opensource]$ cd redis-3.2.11/ [hadoophost152 redis-3.2.11]$ ma…

关于 Resolution(分辨率、解析力)各单位的意义及相互之间的换算

1、问题背景 最近在调试的项目&#xff0c;有关于对解析力的要求&#xff0c;用 imatest 软件测试 MTF50 的值&#xff0c;如下图所示&#xff0c;可以看到他有不同的单位表示&#xff0c;LW/PH、Cycles/pixel 。另外关于解析力的单位还有LP/mm、L/mm、Cycles/mm、LP/PH&#…

Java8实战-总结27

Java8实战-总结27 用流收集数据分区分区的优势将数字按质数和非质数分区 用流收集数据 分区 分区是分组的特殊情况&#xff1a;由一个谓词(返回一个布尔值的函数)作为分类函数&#xff0c;它称分区函数。分区函数返回一个布尔值&#xff0c;这意味着得到的分组Map的键类型是B…

Springboot 集成 Ehcache操作数据库显示SQL语句设置

Springboot 集成 Ehcache操作数据库显示SQL语句设置 2023-09-13 23:33:35.030 INFO 6124 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-09-13 23:33:35.124 INFO 6124 --- [ …

linux安装nacos2.2.0

1、使用docker拉取镜像&#xff1a;docker pull nacos/nacos-server:v2.2.0 2、下载官方配置文件&#xff1a;https://github.com/alibaba/nacos/releases 3、修改配置文件的数据库连接信息&#xff0c;修改完成后将配置文件移至挂载目录/home/shixp/docker/nacos/conf&#xf…

PHP8中删除数组中的重复元素-PHP8知识详解

在 php 8 中&#xff0c;你可以使用array_unique()函数来删除数组中的重复元素。该函数将返回一个新的数组&#xff0c;其中包含原始数组中的唯一元素&#xff0c;而重复的元素只保留第一个出现的。 array_unique()函数返回具有唯一性元素的数组&#xff0c;语法格式如下&#…