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

简介: 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

目录
相关文章
|
6月前
|
JavaScript 数据可视化 前端开发
【Vue.js】vue-cli搭建SPA项目并实现路由与嵌套路由---详细讲解
【Vue.js】vue-cli搭建SPA项目并实现路由与嵌套路由---详细讲解
72 0
|
2月前
|
监控 JavaScript
Vue router路由设计
Vue router路由设计
23 0
|
5月前
|
JavaScript 前端开发 网络架构
Vue3中的路由功能:安装和配置Vue Router、路由的基本用法、动态路由、嵌套路由
Vue3中的路由功能:安装和配置Vue Router、路由的基本用法、动态路由、嵌套路由
129 0
|
6月前
Vue3.0实现todolist-逻辑实现 路由router
Vue3.0实现todolist-逻辑实现 路由router
37 1
|
7月前
|
前端开发 JavaScript 数据安全/隐私保护
使用vue-cli搭建SPA项目及使用和路由及路由嵌套的使用
使用vue-cli搭建SPA项目及使用和路由及路由嵌套的使用
30 0
|
8月前
|
JavaScript 测试技术 开发工具
【Vue】使用vue-cli搭建SPA项目的路由,嵌套路由
Vue CLI 是一个基于 Vue.js 的官方脚手架工具,用于自动生成vue.js+webpack的项目模板,它可以帮助开发者快速搭建 Vue.js 项目的基础结构,并提供了一系列的开发工具和配置选项。Vue CLI 提供了命令行界面和图形化界面两种方式,开发者可以根据自己的喜好选择使用。使用 Vue CLI,可以轻松进行项目初始化、管理依赖、开发调试、构建打包等常用开发任务,简化了 Vue.js 应用的开发流程,提高了开发效率。创建命令如下:xxx为自己创建项目的名称必须先安装等一些必要的环境。
|
JavaScript 前端开发 API
Vue.js:Vue-Router动态路由从服务器接口获取路由数据
Vue.js:Vue-Router动态路由从服务器接口获取路由数据
573 0
|
Web App开发 存储 缓存
原生 js 实现一个前端路由 router
原生 js 实现一个前端路由 router
851 0
原生 js 实现一个前端路由 router
|
网络架构
Koa 路由
Koa 路由
91 0
|
JavaScript 前端开发 网络架构