koa源碼分析(一)http模塊

使用http模塊啓動一個服務

使用koa框架實現一個服務器真的很方便。那麼若是不使用koa,直接使用node的核心模塊,該如何實現一個http服務器呢?node有一個核心模塊http,是用來實現http相關功能的。首先讓咱們回顧下http模塊的基本用法吧:node

const http = require('http')
const httpServer = http.createServer((request, response) => {
  response.setHeader('Content-Type', 'application/json; charset=utf-8')
  response.statusCode = 200
  response.write(JSON.stringify({code:0, message: 'hello world!'}))
  response.end()
})
const port = 3000
httpServer.listen(port,'127.0.0.1')
console.log('listen on ' + port)

僅僅須要這幾行代碼,就能實現一個能返回json的服務了。接下來讓咱們依次解釋下代碼吧:http.createServer這個方法的功能是生成一個http.server對象。http.server對象是一個EventEmitter,有一個重要的事件就是request,每當服務器收到一個請求後,便會觸發request事件。request事件觸發後,會給他的回調函數傳入兩個參數,當前http請求的request對象和response對象。request對象封裝了http請求的相關信息。而response則存放了http響應的相關信息,request,response具體內容可查看node官方文檔。
第一段代碼精簡下就是const httpServer = http.createServer(fn),建立了一個http.server對象,賦值(準確說是引用)給httpServer。併爲httpServer的request時間傳入回調函數。
下面即是httpServer.listen(3000,'127.0.0.1')這句即是讓httpServer這個服務監聽本地的3000端口。代碼運行到這裏便初始化完成了。json

response

當有一個請求過來時,便會觸發request事件的回調函數。回調函數第一句是調用了response的setHeader方法,功能是設置響應頭,根據http協議,只有響應頭的Content-type爲 'application/json'時,客戶端纔會按照json的格式解析響應體。因此咱們要想輸出一個json,就要先設置好這個響應後。接下來爲response的statusCode屬性賦值爲 200,這個即是http響應碼。response.write即是在響應體裏寫內容,咱們寫進了一個json字符串。最後調用end方法,結束這個響應。
接下來咱們用postman請求一下127.0.0.1:3000/,響應結果以下: 響應體 響應頭
響應體即是咱們返回的json。響應頭除了咱們設置的content-type還增長了三個。經過查詢node文檔,response對象有個屬性sendDate,默認爲true,表明若不存在Date響應頭,自動爲其賦值。其他兩個響應頭應該也是相似的道理,這裏再也不贅述。服務器

request

這個代碼的功能實在是有點太low了,不論什麼樣的請求都返回一樣的響應。通常的服務器都是根據請求來生成響應的。那麼咱們如何獲得請求的數據呢?request事件的回調函數中除了response還有一個request參數呢,這裏便能讀取url,method等數據。app

(request, response) => {
  let body = '';
  request.on('data', (chunk) => {
    body += chunk.toString();
  })
  request.on('end', ()=>{
    try{
      const data = JSON.parse(body)
      console.log(data)
    }catch (err){
      console.log(err)
    }
  })
  console.log(request.url)
  console.log(request.method)
  console.log(request.headers)

將回調函數改成這段代碼,變成讀取並在控制檯輸出請求的url,method,headers和body。url,method,headers都能輕鬆的讀取。http並無提供方法或屬性來直接獲取請求體,所以須要本身去寫代碼解析請求體。因爲請求體分爲不一樣的編碼格式,壓縮格式等,因此解析仍是蠻複雜的。上面的代碼只能解析json格式的請求體,字符集是‘utf-8’,功能十分有限。框架

koa腳手架如何使用http模塊

咱們用koa-generator這個模塊來生成一個腳手架。bin裏的www即是啓動文件,裏面的代碼主要是:koa

var app = require('../app');
var debug = require('debug')('demo:server');
var http = require('http')

var port = normalizePort(process.env.PORT || '3000');
var server = http.createServer(app.callback());
server.listen(port);

能夠看出,koa腳手架也是使用了http模塊的createServer,listen方法來啓動一個服務器的。request事件的回調函數是app.callback(),koa讓咱們用它提供的方式來構造出這個回調函數。函數

koa爲咱們作了什麼

咱們能夠看到經過用node提供的http模塊已經可以編寫服務器代碼了,但要是將全部的業務邏輯都寫在那一個回調函數裏,代碼實在太亂了。因此koa的主要任務就是讓咱們用他提供的方式去構造出這個回調函數。koa主要爲咱們作了:
1.封裝了ctx
2.中間件
3.解析請求體(koa-bodyparser)
4.解析路由(koa-router)
接下來咱們來一一去看koa是如何實現的這些功能。post

相關文章
相關標籤/搜索