超級簡歷模板官網(wǎng)北京seo公司公司
概述
Express
是基于Node.js
平臺(建立在Node.js
內(nèi)置的http模塊上),快速、開放、極簡的Web開發(fā)框架。
中文官網(wǎng) http://www.expressjs.com.cn/。
Github地址:https://github.com/orgs/expressjs。
Express
核心特性:
- 可設置中間件來響應 HTTP 請求
- 定義了路由表用于執(zhí)行不同的 HTTP 請求
- 可通過向模板傳遞參數(shù)來動態(tài)渲染 HTML 頁面
安裝
npm i express
以上命令會將express
安裝在當前目錄下的node_modules文件夾下,并且將其依賴的包也一并下載下來
以下幾個和express
搭配使用的包:
- body-parser 用于處理 JSON、Raw、Text和URL中的請求數(shù)據(jù)
- cookie-parser 用于處理Cookie
- multer 用于處理**enctyoe=“multipart/form-data””**的表單數(shù)據(jù)
基本使用
基本使用步驟:
- 導入 express 模塊
- 創(chuàng)建 express 實例
- 創(chuàng)建并啟動HTTP服務
- 綁定請求事件
// 1. 導入 express 包
const express = require('express')// 2. 創(chuàng)建 express 實例
const app = express()// 3. 啟動服務
app.listen(80, () => {console.log("Express server is starting ...")
})// 4. 綁定請求事件
app.get("/", (req, res) => {console.log("請求進來了 >>> " + req.url)res.end("Hello Node.js")
})
set 方法
set
方法用于指定變量的值
// 設置 端口
app.set("port", process.env.PORT)// 設定views變量,意為視圖存放的目錄
app.set('views', path.join(__dirname, 'views'));// 設定view engine變量,意為網(wǎng)頁模板引擎
app.set('view engine', 'jade');
請求和響應
Express
處理請求中回調(diào)函數(shù)的參數(shù):request和response對象來處理請求和響應。
request 對象
request
對象表示 HTTP請求,包含了請求查詢的字符串,參數(shù)、內(nèi)容、HTTP頭部等屬性。常見屬性:
- request.app 當callback為外部文件時,用其訪問express實例
- request.baseUrl 獲取當前的 URL 路徑
- request.method 獲取請求方法
- request.body 獲取請求體內(nèi)容
- request.cookie 獲取 Cookie 內(nèi)容
- request.hostname 獲取主機名
- request.ip 獲取IP
- request.originalUrl 獲取原始請求 URL
- request.params 獲取請求參數(shù)(動態(tài)匹配的參數(shù))
- request.path 獲取請求路徑
- request.protocol 獲取請求協(xié)議
- request.query 獲取URL的查詢參數(shù)
- request.route 獲取請求匹配的路由
- request.get() 獲取指定的請求頭
- request.is() 判斷請求頭Content-Type的MIME類型
// http://domain:port/x1/x2/wz?age=18
request.path // /x1/x2/wz
request.params // wz
request.query // age
// 引入express 模塊
const express = require('express')// 創(chuàng)建 實例
const app = express()// 啟動服務
app.listen(80, () => {console.log("Server is starting ...")
})// 綁定 get 請求事件
app.get('/user', (req, res) => {// req.protocol 獲取請求協(xié)議console.log("protocol >>> ", req.protocol)// req.method 獲取請求方法console.log("method >>> ", req.method)// req.hostname 獲取主機名console.log("hostname >>> ", req.hostname)// req.ip 獲取請求 IPconsole.log("ip >>> ", req.ip)// req.originalUrl 獲取請求原始路徑console.log("originalUrl >>> ", req.originalUrl)// req.path 獲取請求路徑console.log("path >>> ", req.path)// req.route 獲取請求路由console.log("route >>> ", req.route)// req.params 獲取請求參數(shù)console.log("params >>> ", req.params)// req.query 獲取請求查詢參數(shù)console.log("query >>> ", req.query)// req.body 獲取請求體console.log("body >>> ", req.body)res.end("GET")
})// 綁定 post 請求事件
app.post('/user', (req, res) => {// req.protocol 獲取請求協(xié)議console.log("protocol >>> ", req.protocol)// req.method 獲取請求方法console.log("method >>> ", req.method)// req.hostname 獲取主機名console.log("hostname >>> ", req.hostname)// req.ip 獲取請求 IPconsole.log("ip >>> ", req.ip)// req.originalUrl 獲取請求原始路徑console.log("originalUrl >>> ", req.originalUrl)// req.path 獲取請求路徑console.log("path >>> ", req.path)// req.route 獲取請求路由console.log("route >>> ", req.route)// req.params 獲取請求參數(shù)console.log("params >>> ", req.params)// req.query 獲取請求查詢參數(shù)console.log("query >>> ", req.query)// req.body 獲取請求體console.log("body >>> ", req.body)res.end("POST")
})
response 對象
response
對象表示 HTTP響應,即在接受到請求時向客戶端發(fā)送的數(shù)據(jù)。常見屬性:
- response.app 當callback為外部文件時,用其訪問express實例
- response.cookie(name, value[, options]) 設置Cookie信息
- response.clearCookie() 清空Cookie
- response.download() 傳送指定的文件
- response.get() 獲取指定的HTTP頭信息
- response.set(name, value) 設置響應頭(Header)
- response.json() 響應JSON格式的數(shù)據(jù)
- response.render(view[, locals], callback) 渲染網(wǎng)頁模版
- response.send() 發(fā)送響應
- response.sendFile(path[, options][, fn]) 傳送文件
- response.status() 設置 HTTP 狀態(tài)碼
- response.type() 設置 Content-Type的 MIME類型
- response.redirect() 設置重定向
路由
路由
即路徑映射。在Express
中,路由指客戶端的請求與服務器處理函數(shù)的映射。
Express
中路由是一個單獨的組件Express.Router
。
Express
中路由由三部分組成,分別為請求類型、請求URL、處理函數(shù)。其格式如下:
app.method(path, handler())
路由匹配過程
- 請求到達服務器時,先經(jīng)過路由的匹配,匹配成功了,才會調(diào)用對應的處理函數(shù)
- 在匹配時,按照定義的順序依次匹配,僅當請求類型和請求URL同時匹配成功了,才會調(diào)用對應的處理函數(shù)
// 導入 express 模塊
const express = require('express')// 創(chuàng)建 express 實例
const app = express()// 創(chuàng)建路由實例
const router = express.Router()// 掛載路由
router.get('/user', (req, res) => {res.send("express router")
})// 注冊路由
app.use('/api', router)// 啟動服務
app.listen(80, () => {console.log("Server is starting ...")
})// 訪問路徑 http://domain:port/api/user
中間件
中間件(Middleware
)指業(yè)務流程的中間處理環(huán)節(jié)。其是一個函數(shù),包含了request、respoonse、next三個參數(shù),其中 next() 把流轉(zhuǎn)交給下一個中間件或路由。
Express
中間件調(diào)用流程
注意:
- 在注冊路由之前注冊中間件(錯誤中間件除外)
- 多個中間件共享request和response對象
- next() 函數(shù)后不能再寫邏輯代碼
全局中間件
通過app.use()
注冊的中間件為全局中間件
const express = require('express')const app = express()// 注冊全局中間件
app.use((req, res, next) => {console.log("中間件A")
})// 注冊全局中間件
app.use((req, res, next) => {console.log("中間件B")
})app.get('/user', (req, res) => {res.send("ok")
})app.listen(8888)
局部中間件
const express = require('express')const app = express()// 定義中間件
const mw1 = (req, res, next) => {console.log("中間件A")
}// 注冊全局中間件
const mw2 = (req, res, next) => {console.log("中間件B")
}app.get('/user', mw1, mw2, (req, res) => {res.send("ok")
})app.post('/user', [mw1, mw2], (req, res) => {res.send("ok")
})app.listen(8888)
中間件分類
中間件按照作用可劃分為三類:應用級別中間件、路由級別中間件、錯誤級別中間件。
應用級別中間件
通過app.use()
或app.method()
注冊,即綁定到app實例上的中間件即為應用級別中間件。(其中method為get
、post
、put
、delete
等請求方法)
const express = require('express')const app = express()// 注冊路由
app.use('/', (req, res, next) => {next()
})
路由級別中間件
通過router.use()
注冊,即綁定到router實例上的中間件即為路由級別中間件。
const express = require('express')const app = express()
const router = express.Router()// 路由上注冊中間件
router.use((req, res, next) => {next()
})// 注冊路由
app.use('/', router)
錯誤級別中間件
錯誤級別中間件用來捕獲整個項目中發(fā)生的異常,從而防止項目異常崩潰。
錯誤級別中間件的處理函數(shù)中必須有4個形參,即(error, request, response, next)
錯誤級別中間件必須注冊在所有路由之后
const express = require('express')const app = express()// 請求處理 ...// 注冊錯誤中間件
app.use((err, req, res, next) => {next()
})
內(nèi)置中間件
Express
中內(nèi)置了多個中間件,極大的提高了 Express 項目的開發(fā)效率。常見內(nèi)置中間件:
-
express.static 快速托管靜態(tài)資源
express.static(root[, options])
-
express.json 解析JSON格式的請求體數(shù)據(jù)
-
express.urlencoded 解析 url-encoded 格式的請求體數(shù)據(jù)
// 快速托管靜態(tài)資源
app.use(express.static(path))// 通過 express.json() 這個中間件,解析表單中的 JSON 格式的數(shù)據(jù)
app.use(express.json())// 通過 express.urlencoded() 這個中間件,來解析表單中的 url-encoded 格式的數(shù)據(jù)
app.use(express.urlencoded({ extended: false }))
第三方中間件
cookie-parser
cookie-parser
用于處理請求中的Cookie。
https://github.com/expressjs/cookie-parser
設置Cookie
res.cookie(name, value[, options])
參數(shù)說明
- name cookie名稱
- value cookie值
- options 配置參數(shù)
- domain 域名。默認為當前域名
- expires 失效時間。未設置或0,表示瀏覽器關(guān)閉后即失效
- maxAge 最大失效時間(指從當前時間開始多久后失效),單位毫秒
- secure 為 true時,cookie 在 http 失效,https 生效
- path cookie在什么路徑下有效。默認為**/**
- httpOnly 只能被訪問,防止 XSS攻擊
- signed 是否簽名。默認指為false
不簽名實例
const express = require('express')
const cookieParser = require('cookie-parser')// 創(chuàng)建 app 實例
const app = express()// 注冊 Cookie中間件
app.use(cookieParse())app.get('/setCookie', (req, res) => {res.cookie('name', '張三', {maxAge: 10000})res.send('cookie set success!')
})app.listen(8888)
簽名實例
const express = require('express')
const cookieParser = require('cookie-parser')const app = express()app.use(cookieParser('^123$')) // ^123$ 為簽名秘鑰app.get('setCookie', (req, res) => {// 將cookie的name 進行簽名res.cookie("name", "張三", {maxAge: 100000, signed: true})
})
獲取Cookie
注意:
Cookie簽名與不簽名獲取的方式不一樣。req.cookies
獲取不簽名的cookie;req.signedCookies
獲取簽名的cookie。
不簽名實例
const express = require('express')
const cookieParser = require('cookie-parser')// 創(chuàng)建 app 實例
const app = express()// 注冊 Cookie中間件
app.use(cookieParser()) //app.get('/getCookie', (req, res) => {console.log(req.cookies)res.send("cookie got")
})app.listen(8888)
簽名實例
const express = require('express')
const cookieParser = require('cookie-parser')// 創(chuàng)建 app 實例
const app = express()// 注冊 Cookie中間件
app.use(cookieParser('^123$')) // ^123$ 為簽名秘鑰app.get('/getCookie', (req, res) => {console.log(req.signedCookies)res.send("cookie got")
})app.listen(8888)
刪除Cookie
res.clearCookie(name[, options])
express-session
express-session
用于處理請求中的會話。
https://github.com/expressjs/session
配置 session
session(options)
參數(shù)說明:
- options 配置參數(shù)
- cookie cookie設置
- genid sessionid算法。默認為uid-safe庫自動生成id
- name 會話名稱。默認為 connect.sid
- secret 會話簽名秘鑰
- store 會話存儲方式。默認為內(nèi)存
- resave 是否強制保存會話,及時未被修改也被保存。默認為true
- saveUninitialized 強制將未初始化的會話保存至存儲中。(會話是新的且未被修改即為未初始化)
- unset 是否保存會話。默認為keep,不保存可設置為destory
const express = require('express')
const session = require('express-session')const app = express()app.use(session({name: "session-cookie",secret: "^123456$", // 會話簽名秘鑰cookie: {maxAge: 2 * 60 * 60 * 1000}
}))
req.session
req.session
可用于存儲或訪問會話數(shù)據(jù),以JSON的形式序列化。
const express = require('express')
const session = require('express-session')// 創(chuàng)建服務實例
const app = express()// 配置session,并注冊session中間件
app.use(session({name: "express",secret: "^123456$",resave: false,saveUninitialized: true
}))app.get('/setSession', (req, res) => {// 存儲會話req.session.name = "李四"res.send("set session success")
})app.get('/getSession', (req, res) => {// 獲取會話console.log(req.session)res.send("session got")
})// 啟動服務
app.listen(8888)
屬性
屬性 | 說明 |
---|---|
req.session.id | 會話ID |
req.session.sessionID | 會話ID |
req.session.cookie | 獲取會話中的 cookie 對象, 而后可對其修改 |
req.session.cookie.maxAge | 會話有效剩余時長 |
req.session.cookie.originalMaxAge | 返回會話 cookie 的原始 maxAge, 以毫秒為單位 |
方法
方法 | 說明 |
---|---|
req.session.regenerate(callback) | 重新生成會話 |
req.session.destroy(callback) | 銷毀會話并取消設置 req.session 屬性 |
req.session.reload(callback) | 從存儲重新加載會話數(shù)據(jù)并重新填充 req.session 對象 |
req.session.save(callback) | 講會話保存至 store,用內(nèi)存中的內(nèi)容替換 store上的內(nèi)容 |
req.session.touch() | 更新 .maxAge屬性 |
JWT
JWT
(JSON Web Token)是由三部分組成:Header、Payload(真正的用戶信息,加密后的字符串)、Signature。
JWT
工作原理:用戶的信息以Token的字符串的形式,保存在客戶端中。用戶每次請求,將Token存放在請求頭Authorization上,服務器拿到該值后進行解析處理。
Express
中jsonwebtoken
模塊用于生成JWT字符串,express-jwt
用于將JWT字符串還原成JSON對象。
使用
- 安裝模塊
npm install jsonwebtoken express-jwt
- 引入模塊
const jwt = requre('jsonwebtoken') const expressJWT = require('express-jwt')
- 生成 JWT 字符串
jwt.sign(payload, secret[, options[, callback]])
payload 存儲的對象
secret 簽名秘鑰
options 配置參數(shù)。常見有 expiresIn(過期時間)、algorithm(簽名算法)
callback 回調(diào)函數(shù)app.post('/api/login', (req, res) => {let token = jwt.sign({username: username}, '^123456$', {expireIn: '2h'}) })
- 還原 JWT 字符串
// 此處的 secret 值必須和jwt 生成時所使用的秘鑰相同 // unless 指定了哪些接口無須攜帶Token訪問 app.use(expressJWT({secret: '^123456$'}).unless({path:[/^\/api\//]}))
- 獲取 JWT 信息
在訪問權(quán)限的接口中,可通過req.user對象即可訪問 JWT 字符串中解析的內(nèi)容
- 捕獲 JWT 異常
// 通過異常中間件來處理JWT解析失敗 app.use((err, req, res, next) => {if(err.name === 'UnauthorizedError') {// TODO}next() })
multer
multer
是用于處理multipart/form-data
類型的表單數(shù)據(jù),主要用于上傳文件。(不會處理任何非 multipart/form-data 的數(shù)據(jù)
)
multer
在解析完請求體后,會向request對象上添加一個body對象和一個file或files對象。body對應表單中提交的文本字段,file或files包含了表單上傳的文件。
https://github.com/expressjs/multer
multer(options)
參數(shù)說明:
- options 參數(shù)配置
- dest / storage 上傳文件存放目錄。
- fileFilter 文件過濾器
- limits 限制上傳文件 (可有效防止Dos攻擊)
- fieldNameSize field名字最大長度。默認為 100 bytes
- fieldSize field指最大長度。默認為1MB
- fields 非文件field的最大數(shù)量。默認為無限
- fileSize 文件最大長度,單位字節(jié)。默認為無限
- files 文件最大數(shù)量。默認為無限
- parts part傳輸?shù)淖畲髷?shù)量(field + file)。默認為無限
- headerPairs 鍵值對最大組數(shù)。默認為2000
- preservePath 保存包含文件名的完整路徑
storage
storage
為存儲引擎,multer
中具有DiskStorage、MemoryStorage和第三方等引擎。
DiskStorage
DiskStorage
為磁盤存儲引擎,其有兩個選項可用:destination和filename。
destination 用來確定上傳的文件存放的位置。可提供一個 string或function。若沒有設置則使用操作系統(tǒng)默認的臨時文件夾。
注意:
若destination 是一個function,則需用手動創(chuàng)建文件夾;若destination 是一個string,multer 會自動創(chuàng)建。
filename用來確定文件夾中文件名。若未設置該參數(shù),則文件將設置一個隨機文件名且沒有后綴名。
const storage = multer.DiskStorage({distination: function(req, file, cb) {cb(null, '/xxx/xxx')}filename: function(req, file, cb) {cb(null, file.fieldname + "_" + Date.now())}
})const upload = multer({storage: storage})
MemoryStorage
MemoryStorage
為內(nèi)層存儲引擎(將內(nèi)容存儲在Buffer中)
const storage = multer.memoryStorage()
const upload = multer({storage: storage})
注意:
當使用內(nèi)層存儲,上傳文件非常大,或上傳文件非常多時,可能會導致內(nèi)層溢出。
方法
multer.single(fieldname)
multer.signle()
接受一個以filename命名的文件,文件保存至request.file中
multer.array(fieldname[, maxCount])
multer.array()
接受一個以fieldname命名的文件數(shù)組,可配置maxCount來限制上傳文件數(shù)量,文件保存至request.files中
multer.fields(fields)
multer.fields()
接受fileds的混合文件,文件保存至request.files中
multer.none()
multer.none()
只接受文本域,和multer.fields([])
效果一樣。若該模式有文件上傳,則拋出LIMIT_UNEXPECTED_FILE
multer.any()
multer.any()
接受一切上傳的文件。文件保存至request.files中
const multer = require('multer')// 存儲設置
const storage = multer.DiskStorage({distination: function(req, file, cp) {cp(null, '/xxx/xx')}filename: function(req, file, cp)
})const upload = multer({storage:storage})app.post('/upload/photo', upload.single('avatar'), function (req, res) {// req.file 是 `avatar` 文件的信息// req.body 將具有文本域數(shù)據(jù),如果存在的話
})app.post('/upload/file', upload.array('file', 3), function (req, res) {// req.files 是 `file` 文件組的信息// req.body 將具有文本域數(shù)據(jù),如果存在的話
})app.post('/upload', upload.fields([{name: 'avatar', maxCount: 1},{name: 'file', maxCount: 3}]), function (req, res) {// req.files 是一個對象 (String -> Array) 鍵是文件名,值是文件數(shù)組// req.files['avatar'][0] -> File// req.files['file'] -> Array// req.body 將具有文本域數(shù)據(jù),如果存在的話
})
文件屬性
屬性 | 說明 |
---|---|
fieldname | 表單定義的名稱 |
originalname | 文件原始名稱 |
encoding | 文件編碼 |
mimetype | 文件的 MIME 類型 |
size | 文件大小 |
distination | 文件保存路徑 |
filename | 保存至 distination 中的文件名 |
path | 已上傳文件的完整路徑 |
buffer | 存放整個文件的 Buffer |
自定義中間件
自定義中間件流程:
- 定義中間件
- 監(jiān)聽request對象的 data 事件
- 監(jiān)聽 request 對象的 end 事件
- 解析請求參數(shù)
- 封裝模塊
自定義中間件解析POST提交的數(shù)據(jù)
// querything 是 Node.js的內(nèi)置模塊
const qs = require('querything')// 定義中間件
const bodyParser = (req, res, next) => {let str = ''// 監(jiān)聽 req 的 data 事件req.on('data', (chunk) => {str += chunk})req.on('end', () => {// 解析數(shù)據(jù),并將數(shù)據(jù)放在 req 的 body 中,供下游訪問req.body = qs.parse(str)next()})
}module.exports = bodyParser
模板
Express
模板是用于渲染視圖的文件,可以包含HTML、CSS、JavaScript等內(nèi)容,用于構(gòu)建 Web應用程序的圖形界面。
使用Express
模板可以快速、方便地創(chuàng)建Web應用程序,并可輕松地將動態(tài)數(shù)據(jù)注入到模板中,以便呈現(xiàn)動態(tài)效果。常見的模版引擎有:EJS、Pug、Handlebars 等。
分類
Express
模板可分靜態(tài)模板和動態(tài)模板兩類:
- 靜態(tài)模板 預先定義好的 HTML 文件,可通過路由直接呈現(xiàn)
- 動態(tài)模板 通過模版引擎加載動態(tài)數(shù)據(jù)來生成動態(tài)內(nèi)容
Express
中常用的模板引擎:
- 基于
HTML
的模版引擎:Mustache、Handlebars - 基于
JavaScript
的模版引擎:EJS、Underscore.js - 基于
CSS
的模版引擎:LESS、SASS
使用
模版使用步驟
- 下載模板包
- 配置模版引擎
app.set("view engine", "xxx")
- 配置模板路徑
app.set("views", path.resolve(__dirname, "views"))
(表示模板存放在當前目錄下views文件夾中) - 在請求響應中設置渲染
res.render('xx',renderDataObj)
express-generator
express-generator
是 快速創(chuàng)建 express 項目生成器工具。
使用
## 1. 全局安裝 express-generator
npm i -g express-generator## 2. 創(chuàng)建項目
#### 快速創(chuàng)建 [project_name[ 的項目,并且使用默認的 jade 模板引擎
express [project_name] #### 快速創(chuàng)建 [project_name[ 的項目,并且使用指定的 ejs 模板引擎
express [project_name] --view=ejs## 3.進入到項目根目錄下執(zhí)行 npm install
npm install## 4. 啟動項目
#### npm 命令
npm run start 或 npm start#### node 命令
node ./bin/www## 5.訪問 express-generator生成的項目服務默認端口為 3000