閱讀更多系列文章請訪問我的GitHub部落格,示例程式碼請訪問這裡。
Express介紹
基於 Node.js 平臺,快速、開放、極簡的 Web 開發框架。
Express的特點是易於入門,而且可以使用各種中介軟體擴充套件它的功能。
但由於Express開發相對較早,主要使用回撥函式進行非同步操作,無法使用Async函式,因此原團隊也開發了功能更強大的Koa來解決Express的不足之處。
不過對於開發人員,Express還是不可或缺的一項重要技能。
使用Express建立伺服器
示例程式碼:/lesson01/server.js
- 在
/lesson01
資料夾通過npm init -y
初始化專案 - 使用
npm install express --save
安裝Express - 引用Express並建立伺服器
const express = require('express')
const server = express()
server.listen(8080)
console.log(`Server started at 8080`)
複製程式碼
常用路由配置方法
示例程式碼:/lesson01/server.js
通常接收到的請求不止get方法,常用的有:
server.get
,處理get請求server.post
,處理post請求server.use
,處理所有方法的請求,它的第一個路由引數可以不傳,此時表示處理所有介面請求,如下:
server.use('/first', (req, res, next) => {
console.log('first')
next()
})
複製程式碼
除了這3個方法之外,還有server.put、server.delete等方法,具體可以檢視文件
新增路由
示例程式碼:/lesson01/server.js
Express自帶了路由功能,不需要引用中介軟體即可新增路由。
server.get('/first', (req, res, next) => {
res.send({
error: 0,
msg: '請求成功'
})
})
複製程式碼
程式碼含義如下:
- 建立了一個get請求的路由。
- 第一個引數'/first'表示請求的路由名稱。
- 第二個引數為回撥函式。
- 回撥函式傳參req表示請求引數例項。
- 回撥函式傳參res表示響應引數例項。
- next用於觸發下一步操作。
- res.send可以向前臺傳送資料,與原生node.js的res.write方法不同,它不止可以傳送Buffer、字串,還可以直接傳送JSON等資料,如下:
res.send(new Buffer('wahoo'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
res.send(404, 'Sorry, cant find that');
res.send(404);
複製程式碼
此時訪問http://localhost:8080/first,即可看到頁面顯示:{"error":0,"msg":"請求成功"}
。
next方法的使用
示例程式碼:/lesson01/server.js
next方法的作用是用於對請求的多級處理,例如:
server.get('/second', (req, res, next) => {
if (Number(req.query.num) > 10) {
// 滿足條件時,才可觸發同名的下一個路由。
next()
} else {
res.send({
error: 1,
msg: '請輸入大於10的數字'
})
}
})
server.get('/second', (req, res, next) => {
res.send({
error: 0,
msg: '輸入成功'
})
})
複製程式碼
程式碼含義如下:
- 若配置了多個同名路由,程式碼會從上到下按順序執行,但如果未呼叫next方法,執行過程會中斷。
- 如果介面傳參為http://localhost:8080/second?num=8,無法滿足num > 10的條件,則不會執行第二個/second路由回撥函式中程式碼,直接返回錯誤。
- 如果介面傳參為http://localhost:8080/second?num=80,滿足了num > 10的條件,則可以執行第二個/second路由回撥函式中程式碼,進行下一步處理。
- next方法在處理中介軟體時十分有用,因為在各級中介軟體的處理中,可以通過next方法判斷是否需要執行下一級處理,
next方法傳參
示例程式碼:/lesson01/server.js
有時會需要給下一級的處理傳參,只要直接給req例項中新增屬性即可,但請注意不要覆蓋系統預設屬性,如下:
server.get('/second', (req, res, next) => {
if (Number(req.query.num) > 10) {
// 滿足條件時,才可觸發同名的下一個路由。
req.randomNum = Math.floor(Math.random() * 100)
next()
} else {
res.send({
error: 1,
msg: '請輸入大於10的數字'
})
}
})
server.get('/second', (req, res, next) => {
res.send({
error: 0,
msg: `輸入成功,接收到的隨機數為${req.randomNum}`
})
})
複製程式碼
訪問http://localhost:8080/second?num=80即可看到前臺列印出的req.randomNum結果。