過一遍express文檔,我發現了這些

重要的概念

簡單的說web服務器要作的事情就是讀取請求-->寫入響應,根據http協議,請求的數據包括請求行、請求頭(headers)和請求體,響應的數據包括響應頭、響應行(headers)和響應體,咱們也就須要跟上面這幾類數據打交道了,http複雜的地方在於headers的規則比較多。web框架的做用就是幫助咱們更好的讀取請求和設置響應node

express最重要的概念就是中間件,核心的api爲:app.use(<中間件函數>),express應用處處都是use的使用。甚至能夠說express就是一箇中間件的庫。 請求進來後通過一個個中間件函數的「加工」,在任何一個「加工」過程均可以完成響應,或者使用next()進入下一個中間件,看看官方的hello world示例:git

const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
複製代碼

你會發現爲啥沒有使用use中間件,不是說express處處都是use嗎?其實這段代碼至關於這樣寫:github

const express = require('express')
const app = express()
const port = 3000
app.use((req, res) => {
    if(req.path === "/" && req.method === "GET") {
        res.send('Hello World!')
    }
})
app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
複製代碼

app.get()也只是一個語法糖,若是你沒有發現express就是一箇中間件的庫,大概是由於裏面基於app.use的語法糖太多了,例如app.post()、app.route()等等。其實express中基於路由的封裝,自己就是在中間件的基礎上加了一層請求路徑的處理和判斷。web

不少基於express的庫,只要是經過use調用的,都是返回一箇中間件。例如express自帶的express.staticexpress

app.use(express.static(path.join(__dirname, 'public')));
複製代碼

express.static() 返回值或許能夠長這樣(純粹瞎猜的):json

(req, res, next) => {
    if(請求路徑匹配) {
        // 讀取文件並響應
    } else {
        next()
    }
}
複製代碼

中間件的模式很方便往應用中加功能,也有利於的第三方開發者豐富express生態。api

下面大概看一遍express的api文檔並記錄重要的知識點。promise

express

express.json()及與之相似的api

將數據解析成json的中間件, 如application/json類型,它是json字符串,最終會被解析成json瀏覽器

express.urlencoded(): 處理像application/x-www-form-urlencoded類型(該類型是以key=xxx&name=111的形式傳輸)的數據,解析成對象緩存

express.raw():解析請求體爲Buffer,

express.text() : 解析請求體爲字符串,

總結: 上面的接口都是處理請求主體的數據,它會根據請求的content-type來決定是否處理。例如express.json()默認解析content-type爲「application/json」的請求,若是content-type爲「application/json」可是請求體是個普通字符串,這樣就會解析出錯。另外請求的數據是以流的形式傳輸,使用這類中間件就能夠直接在request.body中獲得須要的數據。不然則只能手動讀取流數據,再進行解析。

express.static()

注意點:若是訪問文件不存在,則會轉給後面的請求處理中間件:

const express = require('express')
const app = express()
app.use(express.static('static'))
app.use((request, response, next) => {
  response.end('hi')
  next()
})
app.listen(3000, () => console.log(`App listening on port 3000!`))
複製代碼

上面代碼訪問文件不存在仍是會返回hi,存在則返回文件。再次體會中間件的魅力

Application

  • app.set (可設置模板引擎 )

  • app.get (app.set設置的值)

  • app.locals 全局變量

  • app.use

  • app.post/app.put/app.get 等等

  • app.on('mount', ()=>{})

Request

大多數屬性只是獲取請求中直接能拿到的信息,只是express簡單幫你加工判斷一下,好比req.baseUrl、req.body、req.cookies、req.hostname、req.method、req.query等等。 須要注意幾個:

  • req.fresh: 瀏覽器協商緩存有關, 根據請求頭和響應頭判斷是否可使用瀏覽器緩存,判斷規則可參考這個
  • req.range: 和文件分片下載有關

Response

location 重定向配合301狀態碼

format 根據請求的accept來響應不一樣的數據

attachment 幫你設置Content-Disposition響應頭,實現下載

send一次性發送 / write流的方式寫

寫的比較粗略,後面用到再慢慢補充吧

其它文章:

相關文章
相關標籤/搜索