日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Express基础

發布時間:2025/6/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Express基础 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 簡介

Express是一個基于Node平臺的web應用開發框架,它提供了一系列的強大特性用來創建各種Web應用。

  • 提供了方便簡潔的路由定義方式;
  • 對獲取HTTP請求參數進行了簡化處理;
  • 對模板引擎支持程度高,方便渲染動態HTML頁面;
  • 提供了中間件機制有效控制HTTP請求;
  • 擁有大量第三方中間件對功能進行擴展。

可以使用 npm install express?命令安裝Express,安裝后包含兩個文件夾:

  • node_modules:包含所有依賴包;
  • package-lock.json:所有依賴包的清單。

再在根目錄新建文件server.js,具體使用方法見第3節。

2 原生Node.js與Express框架路由實現對比

2.1 原生Node.js路由

app.on('request', (req, res) => {// 獲取客戶端的請求路徑let {pathname} = url.parse(req.url)// 對請求路徑進行判斷,不同的路徑地址響應不同的內容if (pathname == '/' || pathname == 'index') {res.end('歡迎來到首頁!')} else if (pathname == '/other') {res.end('歡迎來到其他頁面!')} else if (pathname == '/about') {res.end('歡迎來到關于頁面!') } else {res.end('抱歉,沒有找到相關頁面!')} })

2.2 Express路由

// 當客戶端以get方式訪問/時 app.get('/', (req, res) => {// 對客戶端做出響應res.send('使用get方式請求了/路由') })// 當客戶端以post方式訪問/about路由時 app.post('/about', (req, res) => {res.send('使用post方式請求了/about路由') })

3 Express框架簡單使用

啟動一個Express網站服務器并開啟一個“/”的路由監聽:

// 1.引入Express框架,并創建Express實例 const express = require('express') // 2.創建網站服務器對象 const app = express()// 3.定義路由 // 第一個參數是請求的路徑,'/'代表根路徑localhost:3000 // 第二個參數是一個函數,req是request的縮寫,表示客戶端提交過來的數據 // res是respond的縮寫,表示要響應回的數據 app.get('/', (req, res) => {// send()方法,響應給客戶端信息// 1. send方法內部會檢測響應內容的類型// 2. send方法會自動設置http狀態碼// 3. send方法會幫我們自動設置響應的內容類型及編碼res.send('Hello Express!') })// 4.監聽端口,第二個參數回調函數啟動成功后執行的內容 app.listen(3000, () => {console.log('網站服務器啟動成功!') })

輸入node server.js啟動服務器,但因node項目在每次編輯后都要重新啟動才會生效,所以使用nodemon工具來自動啟動服務,推薦全局安裝,命令如下:

npm install -g nodemon

安裝成功后就可以使用命令nodemon server.js來啟動服務。

4 中間件

中間件就是一系列方法,可以接收客戶端發來的請求、可以對請求做出響應,也可以將請求繼續交給下一個中間件繼續處理。

中間件主要由兩部分構成,中間件方法以及請求處理函數。
中間件方法由Express提供,負責攔截請求,請求處理函數由開發人員提供,負責處理請求。
可以針對同一個請求設置多個中間件,對同一個請求進行多次處理。

app.get('/request', (req, res, next) => {req.name = 'Jack'next() }) app.get('/request', (req, res) => {res.send(req.name) })

默認情況下,請求從上到下依次匹配中間件,一旦匹配成功,終止匹配。可以調用 next()?方法將請求的控制權交給下一個中間件,直到遇到結束請求的中間件。

4.1 萬能中間件 app.use

app.use 匹配所有的請求方式,可以直接傳入請求處理函數,代表接收所有的請求。

app.use((req, res, next) => {console.log(req.url)next() })

app.use?第一個參數也可以傳入請求地址,代表不論什么請求方式,只要是這個請求地址就接收這個請求。

app.use('/about', (req, res, next) => {console.log(req.url)next() })

4.2 中間件的應用

  • 路由保護,客戶端在訪問需要登錄的頁面時,可以先使用中間件判斷用戶登錄狀態,用戶如果未登錄,則攔截請求,直接響應,禁止用戶進入需要登錄的頁面。
  • // 登錄過程模擬 app.get('/admin', (req, res, next) => {// 用戶沒有登錄let isLogin = falseif (isLogin) {// 如果用戶登錄,讓請求繼續向下執行next()} else {res.send('您還沒有登錄,不能訪問當前頁面!')} })app.use('/admin', (req, res, next) => {res.send('您已經登錄,可以訪問當前頁面!') })
  • 網站維護公告,在所有路由的最上面定義接收所有請求的中間件,直接為客戶端做出響應,網站正在維護中。
  • app.use((req, res, next) => {res.send('當前網站正在維護。。。')// 由于沒有使用next()傳遞給下一個中間件,所以會停留在此處 })
  • 自定義404頁面,把中間件定義在最后面。
  • app.use((req, res, next) => {// 為客戶端響應404狀態碼以及提示信息res.status(404).send('當前訪問的頁面是不存在的。') })

    4.3 處理錯誤中間件

    在程序執行的過程中,不可避免的會出現一些無法預料的錯誤,比如文件讀取失敗,數據庫連接失敗。錯誤處理中間件是一個集中處理錯誤的地方。

    app.get('/index', (req, res) => {// 創建一個錯誤實例并拋出throw new Error('程序發生了未知錯誤!') })app.use((err, req, res, next) => {// 為客戶端響應500狀態碼以及提示信息res.status(500).send(err.message) })

    throw new Error('程序發生了未知錯誤!')?實際上是一個同步代碼,如果異步代碼在執行過程中出現了錯誤,這樣是無法捕捉到的。這個時候需要手動的觸發錯誤處理中間件,當異步API出錯時,需要調用 next()?方法,并把錯誤傳入 next()?方法。

    app.get('/', (req, res, next) => {fs.readFile('/file-does-not-exist', (err, result) => {if (err != null) {next(err)} else {res.send(result)}}) })

    4.4 捕獲錯誤

    在nodejs中,異步API的錯誤信息都是通過回調函數獲取的,支持Promise對象的異步API發生錯誤可以通過catch方法捕獲。異步函數執行如果發生錯誤要如何捕獲錯誤呢?

    try catch?可以捕獲異步函數以及其他同步代碼在執行過程中發生的錯誤,但是不能其他類型的API發生的錯誤。下面代碼中把讀取文件改造成支持異步函數的形式。

    const promisify = require('util').promisify const readFile = promisify(fs.readFile)app.get('/', async (req, res, next) => {try {await readFile('/aaa.js')} catch(err) {next(err)} })

    4.5 構建模塊化路由

    // 創建路由對象 const home = express.Router() // 將路由和請求路徑進行匹配 app.use('/home', home) // 在home路由下繼續創建二級路由 home.get('/index', () => {// 訪問路徑/home/indexres.send('歡迎來到主頁!') })

    5 GET參數的獲取

    Express框架中使用req.query即可獲取GET參數,框架內部會將GET參數轉換為對象并返回。

    // 接收地址欄中問號后面的參數 // 例如:http://localhost:3000/?name=zhangsan&age=30 app.get('/', (req, res) => {console.log(req.query) // {"name": "zhangsan", "age": "30"} })

    6 POST參數的獲取

    Express中接收post請求參數需要借助第三方包 body-parser。它其實是Express官方提供的,官方為了讓包體積更加小巧,將一些工具剝離出來,供開發者按需安裝。
    安裝命令: npm install body-parser?。

    // 引入body-parser模塊 const bodyParser = require('body-parser') // 配置body-parser模塊,攔截所有請求 // extended: false 方法內部使用querystring模塊處理請求參數的格式 // extended: true 方法內部使用第三方模塊qs處理請求參數的格式 app.use(bodyParser.urlencoded({extended: false})) // 接收請求 app.post('/add', (req, res) => {// 接收請求參數console.log(req.body) })

    注:可以直接使用app.use(express.json());代替body-parser。
    【1】https://stackoverflow.com/questions/61551926/express-json-vs-body-parser
    【2】https://cloud.tencent.com/developer/ask/37434

    7 Express路由參數

    在定義時,可以顯式定義請求接收的參數,在url后面用冒號加上參數:

    // localhost:3000/find/123 app.get('/find/:id', (req, res) => {console.log(req.params) // {id: 123} })

    如果要傳遞多個參數,可以繼續添加斜杠和冒號。

    8 靜態資源的處理

    通過Express內置的express.static可以方便地托管靜態文件,例如img、CSS、JavaScript 文件等。

    const path = require('path') app.use(express.static(path.join(__dirname, 'public')))

    現在,public目錄下面的文件就可以訪問了。

    • http://localhost:3000/images/kitten.jpg
    • http://localhost:3000/css/style.css
    • http://localhost:3000/js/app.js
    • http://localhost:3000/images/bg.png
    • http://localhost:3000/hello.html

    除此之外,還可以控制路徑,可以在添加一個參數static,

    app.use('static', express.static(path.join(__dirname, 'public')))

    再訪問靜態資源的時候就要在url中加入static,如:http://localhost:3000/static/hello.html。

    9 跨域處理

    跨域:https://juejin.cn/post/6844904126246027278#heading-1
    現在如有接口:

    app.get('/user', (req, res) => {res.send({name: 'syz',age: '18',}) })

    該接口的訪問地址是:http://localhost:3000/user。使用靜態資源處理,在public文件夾中新建index.html。

    此時通過http://localhost:3000/index.html可以訪問,在body中添加如下內容:

    <script>fetch('http://localhost:3000/user').then(res => res.json).then(data => {console.log(data)}) </script>

    再次訪問http://localhost:3000/index.html,就可以在Console中看到輸出的對象:{name: "syz", age: "18"}。
    這是數據是可以正常訪問到的,此時右鍵index.html,利用vscode插件Live server打卡,該插件會啟動一個以5500為端口的服務:

    訪問地址為:http://127.0.0.1:5500/public/index.html,此時可以發現Console無法請求到數據了,并報了跨域錯誤。

    處理跨域問題需要用到第三方庫:npm i cors,在server.js中添加如下代碼:

    // 引入cors,返回的是一個函數,直接()執行,執行后是一個Express中間件,app.use使用它即可 app.use(require('cors')())

    再訪問http://127.0.0.1:5500/public/index.html即可獲取到數據。

    總結

    以上是生活随笔為你收集整理的Express基础的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。