Express
Express 是一種流行的模型視圖控制器(MVC)Node.js框架,具有快速、極簡和靈活的優(yōu)點,為Web和移動應(yīng)用程序開發(fā)提供了強大的功能集合。
最受歡迎的Node.js框架!
安裝Express
-
安裝Node.js(你肯定已經(jīng)安裝好了Node.js,這點我們無需多言)
-
為你的應(yīng)用創(chuàng)建一個目錄,進入此目錄并以此目錄為你當前的工作目錄:
$ mkdir myapp $ cd myapp
-
通過
npm init
為你的應(yīng)用創(chuàng)建一個package.json
文件 -
接下來終端會讓你輸入一些
package.json
中的幾個參數(shù),推薦按回車默認即可,但有一個需要注意:entry point: (index.js)
這個表示當前應(yīng)用的入口文件,你可以根據(jù)自己的個人習(xí)慣進行適當?shù)男薷模ɡ纾?code>app.js)
-
在
myapp
目錄下安裝Express并將其保存至依賴列表中:$ npm install express --save
-
(不常用)如果臨時安裝express,不需要將其添加至依賴列表中:
$ npm install express --no-save
HelloWorld
在app.js
文件中編寫如下代碼:
const express = require('express')
const app = express()
const port = 8080
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
執(zhí)行命令啟動Web服務(wù)器:
$ node app.js
終端輸出Example app listening on port 8080
即為開啟成功
打開瀏覽器訪問localhost:8080
,瀏覽器主頁面顯示Hello World!
那么恭喜你!Express 在向你招手!
路由
路由指的是確定應(yīng)用程序如何響應(yīng)客戶機對特定端點的請求,該端點是URI(或路徑)和特定的HTTP請求方法。
路由定義采取以下結(jié)構(gòu):
app.METHOD(PATH, HANDLER)
-
app
是 的一個實例express
。 -
METHOD
是HTTP 請求方法,小寫。 -
PATH
是服務(wù)器上的路徑。 -
HANDLER
是路由匹配時執(zhí)行的函數(shù)。
讓我們舉一個小例子(默認你已經(jīng)引用了express方法):
app.get('/', () => {
res.send('Hello World!')
})
中間件
中間件函數(shù)是可以訪問請求對象 ( req
)、響應(yīng)對象( res
) 以及next
應(yīng)用程序請求-響應(yīng)周期中的函數(shù)的函數(shù)。該next
函數(shù)是 Express 路由器中的一個函數(shù),當被調(diào)用時,它會執(zhí)行當前中間件之后的中間件。
中間件功能可以執(zhí)行以下任務(wù):
- 執(zhí)行任意代碼。
- 更改請求和響應(yīng)對象。
- 結(jié)束請求-響應(yīng)周期。
- 調(diào)用堆棧中的下一個中間件。
從 Express 5 開始,返回 Promise 的中間件函數(shù)將next(value)
在拒絕或拋出錯誤時調(diào)用。next
將使用拒絕的值或拋出的錯誤來調(diào)用。
全局中間件
全局中間件是指在應(yīng)用程序中的所有路由中都會執(zhí)行的中間件函數(shù)。這些中間件函數(shù)可以處理請求對象 (req
) 和響應(yīng)對象 (res
),以及調(diào)用 next()
函數(shù)將控制權(quán)傳遞給下一個中間件或路由處理程序。
全局中間件通常通過 app.use()
方法添加到 Express 應(yīng)用程序中。例如:
const express = require('express')
const app = express()
// 全局中間件示例1
app.use((req, res, next) => {
console.log('This is a global middleware')
//給req添加一個屬性
req.requestTime = Date.now()
next()
})
// 路由處理程序
app.get('/', (req, res) => {
res.send('Hello World!')
})
無論用戶請求的是什么路徑,都會首先執(zhí)行該中間件函數(shù)。
應(yīng)用中間件
應(yīng)用級中間件可以選擇性地應(yīng)用于特定的路由或路由組。
const express = require('express')
const app = express()
// 應(yīng)用級中間件示例
const authenticate = function(req, res, next) {
// 檢查用戶是否經(jīng)過身份驗證
const isAuthenticated = true; // 這里應(yīng)該是根據(jù)你的實際邏輯來判斷用戶是否已經(jīng)身份驗證
if (isAuthenticated) {
// 用戶已經(jīng)通過身份驗證,繼續(xù)下一個中間件或路由處理程序
next()
} else {
// 用戶未通過身份驗證,返回未經(jīng)授權(quán)的消息
res.status(401).send('Unauthorized')
}
}
// 將中間件應(yīng)用于特定路由
app.get('/secured', authenticate, (req, res) => {
res.send('This is a secured route')
})
// 不受中間件保護的路由
app.get('/public', (req, res) => {
res.send('This is a public route')
})
在這個示例中,authenticate
函數(shù)是一個應(yīng)用級中間件,它會檢查用戶是否經(jīng)過身份驗證。在 /secured
路由上,通過使用 authenticate
中間件,我們確保只有通過身份驗證的用戶才能訪問該路由。
而對于 /public
路由,沒有任何中間件,因此對所有用戶都是公開可訪問的。
開放跨域請求
cv在你的程序即可,沒什么好解釋的哈哈
app.use(function (req, res, next) {
//設(shè)置允許跨域的域名,*代表允許任意域名跨域
res.header("Access-Control-Allow-Origin", "*")
//允許的header類型
res.header("Access-Control-Allow-Headers", "content-type")
//跨域允許的請求方式
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS")
if (req.method == "OPTIONS") res.sendStatus(200) //讓options嘗試請求快速結(jié)束
else next()
})
幾種常用的Express內(nèi)置中間件函數(shù)
1. JSON格式數(shù)據(jù)中間件函數(shù)
express.json
通常情況下,當客戶端發(fā)送 JSON 格式的數(shù)據(jù)到 Express 服務(wù)器時,我們需要使用 express.json()
中間件來解析這些數(shù)據(jù)。例如:
const express = require('express')
const app = express()
// 使用 express.json() 中間件來解析 JSON 數(shù)據(jù)
app.use(express.json())
// POST 請求示例
app.post('/api/data', (req, res) => {
console.log(req.body); // 訪問 JSON 數(shù)據(jù)
// 處理請求
})
2. 靜態(tài)文件中間件函數(shù)
express.static()
通過使用這個中間件,你可以將指定目錄下的靜態(tài)文件(如圖像文件、JavaScript 文件、文本文件等)映射到一個 URL 路徑上,使得客戶端可以直接訪問這些靜態(tài)文件。例如:
const express = require('express')
const app = express()
// 通常和path一起使用比較方便
const path = require('path')
// 通過path的方法獲取到存放靜態(tài)資源的相對路徑
app.use(express.static(path.join(__dirname, 'public')))
3. 路由中間件函數(shù)
(注意:與上面所述路由含義不同,要加強辨析)
express.Router()
-
使用
express.Router()
可以創(chuàng)建一個新的路由對象,并向其添加路由處理程序。然后,你可以將這個路由對象掛載到你的 Express 應(yīng)用程序的特定路徑上,使得這些路由處理程序只會對與該路徑匹配的請求進行處理。 -
它允許你將路由處理程序組織成模塊化的方式,以便更好地管理和維護你的 Express 應(yīng)用程序。
首先我們需要創(chuàng)建一個路由模塊,例如:
// routers/testRouter.js
const express = require("express")
let router = express.Router()
// 定義路由處理程序
router.get('/', (req, res) => {
res.send('Test')
})
// 導(dǎo)出路由對象
module.exports = router
接下來,我們可以將這個路由模塊掛載到 Express 應(yīng)用程序中:
// app.js(初始入口)
const express = require('express')
const app = express()
// 導(dǎo)入用戶路由模塊
const userRouter = require('./routes/user')
// 將用戶路由模塊掛載到指定路徑上
app.use('/test', userRouter)
當客戶端發(fā)出 /test
、/test/config
這些路徑的請求時,Express 將會調(diào)用 testRouter
中定義的路由處理程序來處理這些請求。
文件上傳與下載
文件上傳
我們需要使用 Node.js 中間件:multer
,附上github的官方multer中文文檔。
我下面將分享一些常用的方法。
- 安裝
multer
:
$ npm install multer
- 使用指定臨時存儲目錄,例如:
const express = require('express')
const multer = require('multer')
const upload = multer({
// 上傳臨時存放在此目錄
dest: "./public/uploads/temp",
})
//所有接口都允許有上傳功能
app.use(upload.any())
(說明一下為什么指定臨時存儲目錄:當上傳文件時,Multer 將會把文件暫存到指定的臨時目錄中,然后你可以在路由處理程序中獲取到文件并進行相應(yīng)的處理。這種方式適合對文件的存儲方式?jīng)]有特別要求的情況,簡單方便。)
- 上傳接口,例如:
app.post("/upload", (req, res) => {
//檢測是否有文件
if (!req.files) {
res.send({
code: 400,
msg: "上傳文件不能為空",
})
return
}
//保存文件
let files = req.files
let ret_files = []
for (let file of files) {
//獲取名字后綴
let file_ext = file.originalname.substring(file.originalname.lastIndexOf(".") + 1)
//使用時間戳作為文件名字
let file_name = new Date().getTime() + "." + file_ext
// 移動文件并且修改文件名字
fs.renameSync(
// 因為multer生成臨時文件的問題,file.filename會是亂碼
process.cwd() + "/public/upload/temp/" + file.filename,
process.cwd() + "/public/upload/" + file_name
)
// 將上傳成功的文件路徑添加到返回數(shù)組中
ret_files.push("/public/upload/" + file_name)
}
// 返回上傳成功的響應(yīng)
res.send({
code: 200,
msg: "ok",
data: ret_files,
})
}
上述let files = req.files的文件信息包括:
fieldname
:字段名,即表單中文件上傳字段的名稱。originalname
:原始文件名,即客戶端上傳的文件的原始名稱。encoding
:文件編碼,即文件的編碼方式。mimetype
:文件的 MIME 類型,即文件的媒體類型。destination
:文件的存儲目錄,即文件上傳后存儲的目錄路徑。filename
:文件名,即文件在存儲目錄中的名稱。path
:文件路徑,即文件在服務(wù)器中的絕對路徑。size
:文件大小,即文件的字節(jié)數(shù)。
補充multer
使用自定義存儲方式的場景,例如:
const express = require('express')
const multer = require('multer')
// 配置 Multer 的存儲引擎
const storage = multer.diskStorage({
// 設(shè)置上傳文件的存儲目錄
destination: function (req, file, cb) {
cb(null, './public/uploads/') // 回調(diào)函數(shù)指定存儲目錄為 'uploads/'
},
// 設(shè)置上傳文件的文件名
filename: function (req, file, cb) {
cb(null, file.originalname) // 回調(diào)函數(shù)指定文件名為上傳文件的原始文件名
}
})
通常,一般的網(wǎng)頁應(yīng)用,只需要使用使用指定臨時存儲目錄!
文件下載
使用res.download()方法即可,例如:
//下載文件
router.get("/download", async (req, res) => {
// 從請求的查詢參數(shù)中獲取要下載的文件名
let file_name = req.query.file_name
// 構(gòu)建要下載文件的完整路徑
let file_path = process.cwd() + "/public/upload/" + file_name
res.download(file_path)
})
常用API
Application
老規(guī)矩,先附上Express官方的API匯總文檔
-
app.all(path, callback [, callback …])
此方法類似于標準app.METHOD()方法,只不過它匹配所有 HTTP 動詞。
舉個小例子:
app.all('/secret', (req, res, next) => { console.log('HELLO WORLD!') next() })
無論你使用哪種HTTP請求,控制臺總會輸出HELLO WORLD!
-
app.use([path,] callback [, callback…])
在指定路徑掛載指定的一個或多個中間件函數(shù):當請求路徑的基址匹配時,執(zhí)行中間件函數(shù)
path
。由于
path
默認為“/”,因此對于應(yīng)用程序的每個請求都將執(zhí)行沒有路徑安裝的中間件。例如,這個中間件函數(shù)將針對應(yīng)用程序的每個請求執(zhí)行:
app.use((req, res, next) => { console.log('Time: %d', Date.now()) next() })
再例如,這個中間件函數(shù)將匹配/abcd開頭的路徑:
app.use('/abcd', (req, res, next) => { console.log('abcd') next() })
路徑示例:
路徑 匹配路徑 '/abcd'
/abcd '/ab(c?)d'
/abcd、/abd `//abc /xyz/` ['/abcd', '/xyz']
/abcd、/xyz -
app.delete(path, callback [, callback …])
-
app.get(path, callback [, callback …])
-
app.post(path, callback [, callback …])
-
app.put(path, callback [, callback …])
Request
- req.baseUrl 獲取基礎(chǔ)路徑
- req.body 獲取body里面的內(nèi)容
- req.hostname 域名
- req.ip 訪問ip
- req.method 請求的方法
- req.originalUrl 原始路徑
- req.params 獲取屬性
- req.path 獲取路徑
- req.protocol 請求協(xié)議
- req.query 獲取query屬性
- req.route 當前路由信息
Response
-
res.download(path [, filename] [, options] [, fn]) 下載文件
-
res.end([data] [, encoding]) 結(jié)束響應(yīng)
-
res.get(field) 獲取相應(yīng)HTTP頭
-
res.redirect([status,] path) 重定向
-
res.status(code) 設(shè)置響應(yīng)的HTTP狀態(tài)
-
req.baseUrl 獲取基礎(chǔ)路徑
-
req.body 獲取body里面的內(nèi)容
-
req.hostname 域名
-
req.ip 訪問ip
-
req.method 請求的方法
-
req.originalUrl 原始路徑
-
req.params 獲取屬性
-
req.path 獲取路徑
-
req.protocol 請求協(xié)議
-
req.query 獲取query屬性
-
req.route 當前路由信息文章來源:http://www.zghlxwxcb.cn/news/detail-842152.html
Response
- res.download(path [, filename] [, options] [, fn]) 下載文件
- res.end([data] [, encoding]) 結(jié)束響應(yīng)
- res.get(field) 獲取相應(yīng)HTTP頭
- res.redirect([status,] path) 重定向
- res.status(code) 設(shè)置響應(yīng)的HTTP狀態(tài)
好啦!如果你覺得我的文章對你有幫助,請給我點個贊吧!非常感謝你能看到這里!文章來源地址http://www.zghlxwxcb.cn/news/detail-842152.html
到了這里,關(guān)于用前端的語言寫后端——Node.js之Express的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!