Typescript express 新手教程 S2 控制器
控制器
温情提示:过强的控制欲会导致控制者与受控双方的心理变态
太长不看
这个让人感到莫名其妙的名字会加重你的误解,是因为有一个 MVC 设计模式的 上下文没有引入
根据MVC的基本定义,(model,view,controller)
控制器是接受输入信息并加以处理再供model和view 使用
那么 视图器 接受 控制器的数据,然后渲染给用户看
而 模型器 包含了对数据的处理逻辑和某些规则(如果有的话),使用对应逻辑处理数据
所以到底什么是控制器
我们之前提到的路由 app.get('/',someHandleFn)可以接受客户端信息,然后处理并响应出可以用于渲染视图的数据,那么它可以是一种控制器。
但是要经历一些包装
下面是一些十分富有文学性的意识流描述。
你这个人真是无聊透的,我已经知道路由怎么用了,还能给客户端发送Hello world,你还非要我学习什么狗屁controller,是不是脑袋有问题。
就算路由特别多,我可以把同一类业务的路由放到子路由中,再挂载到主路由上,为什么非要脱裤子放屁一样地把子路由的东西放到控制器里呢?
好问题!
使用控制器的优点
- 有明确接口,子路由没有
- 有明确含义,子路由没有
- 有明确类型,子路由没有
说了那么多,实际上就是把逻辑类似的程序的功能给抽象出来,再给他起个名字==> 控制器,那么控制器以内,海阔凭鱼跃,控制器以外,只剩下M和V,架构陡然清晰了有木有。
这里有一个前提,小小的前提,就是知道子路由和主路由的使用方式,当然这个名字是我自己起的。
// 主路由使用子路由router ,注意第一个参数"/"
app.use("/",router);
// 另一个文件 Router1.ts 中
const router = Router()
router.get("/somePath",someHandleFn)
上面的内容介绍了express的较为复杂的路由的组织方式
// 这是一个控制器雏形
class PostController implements Controller {
router: Router;
path: string;
constructor() {
this.router = Router();
this.path= "/aChildRoute"
this.router.get(this.path, (req, res) => {
res.send("注意虚空,站位分散");
});
}
}
上面是一个控制器的雏形,请思考:
- 如何使用控制器
- 这个使用者要有什么功能
- 他是一个函数,一个类还是 一段松散的程序文本?
提普斯
- 要使用express.json()中间件来获取req.body当中的json数据
- 当使用postman测试接口的时候,需要先设置 header 的content-Type 为application/json ,再到body项,选择raw,同时把数据格式设置成JSON (随着版本变化可能变化)