簡單的說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
將數據解析成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中獲得須要的數據。不然則只能手動讀取流數據,再進行解析。
注意點:若是訪問文件不存在,則會轉給後面的請求處理中間件:
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,存在則返回文件。再次體會中間件的魅力
app.set (可設置模板引擎 )
app.get (app.set設置的值)
app.locals 全局變量
app.use
app.post/app.put/app.get 等等
app.on('mount', ()=>{})
大多數屬性只是獲取請求中直接能拿到的信息,只是express簡單幫你加工判斷一下,好比req.baseUrl、req.body、req.cookies、req.hostname、req.method、req.query等等。 須要注意幾個:
location 重定向配合301狀態碼
format 根據請求的accept來響應不一樣的數據
attachment 幫你設置Content-Disposition響應頭,實現下載
send一次性發送 / write流的方式寫
寫的比較粗略,後面用到再慢慢補充吧
其它文章: