前言

Koa.js 是基于中间件模式的HTTP服务框架,底层原理是离不开Node.js的http 原生模块。

http模块使用

  1. const http = require('http');
  2. const PORT = 3001;
  3. const router = (req, res) => {
  4. res.end(`this page url = ${req.url}`);
  5. }
  6. const server = http.createServer(router)
  7. server.listen(PORT, function() {
  8. console.log(`the server is started at port ${PORT}`)
  9. })

http服务构成

服务容器

这里的服务容器,是整个HTTP服务的基石,跟apachenginx提供的能力是一致的。

  • 建立了通信连接
  • 指定了通信端口
  • 提供了可自定内容服务容器,也就是服务的回调函数的容器

    1. const http = require('http');
    2. const PORT = 3001;
    3. const server = http.createServer((req, res) => {
    4. // TODO 容器内容
    5. // TODO 服务回调内容
    6. })
    7. server.listen(PORT, function() {
    8. console.log(`the server is started at port ${PORT}`)
    9. })

    服务回调 (内容)

    服务回调,可以理解成服务内容,主要提供服务的功能。

  • 解析服务的请求 req

  • 对请求内容作出响应 res
    1. const router = (req, res) => {
    2. res.end(`this page url = ${req.url}`);
    3. }

    请求 req

    是服务回调中的第一个参数,主要是提供了HTTP请求request的内容和操作内容的方法。
    更多操作建议查看 Node.js官方文档
    https://nodejs.org/dist/latest-v8.x/docs/api/http.html
    https://nodejs.org/dist/latest-v10.x/docs/api/http.html

    响应 res

    是服务回调中的第二个参数,主要是提供了HTTP响应response的内容和操作内容的方法。
    注意:如果请求结束,一定要执行响应 res.end(),要不然请求会一直等待阻塞,直至连接断掉页面崩溃。
    更多操作建议查看 Node.js官方文档
    https://nodejs.org/dist/latest-v8.x/docs/api/http.html
    https://nodejs.org/dist/latest-v10.x/docs/api/http.html

    后续

    通过以上的描述,主要HTTP服务内容是在 “服务回调” 中处理的,那我们来根据不同连接拆分一下,就形成了路由router,根据路由内容的拆分,就形成了控制器 controller。参考代码如下。
    1. const http = require('http');
    2. const PORT = 3001;
    3. // 控制器
    4. const controller = {
    5. index(req, res) {
    6. res.end('This is index page')
    7. },
    8. home(req, res) {
    9. res.end('This is home page')
    10. },
    11. _404(req, res) {
    12. res.end('404 Not Found')
    13. }
    14. }
    15. // 路由器
    16. const router = (req, res) => {
    17. if( req.url === '/' ) {
    18. controller.index(req, res)
    19. } else if( req.url.startsWith('/home') ) {
    20. controller.home(req, res)
    21. } else {
    22. controller._404(req, res)
    23. }
    24. }
    25. // 服务
    26. const server = http.createServer(router)
    27. server.listen(PORT, function() {
    28. console.log(`the server is started at port ${PORT}`)
    29. })