在Node.js中,router.post()
是一種定義Express應用程序中特定網站路徑的方式,用於處理HTTP POST請求。這個API是Express中最常用的路由方法之一,它允許我們使用路由路徑(路徑字元串或 RegExp)、中間件功能和回調函數來響應客戶端的POST請求。
一、基本使用
使用router.post()
定義一個路由。可以是鏈式語法,也可以使用單獨的語法,如下所示:
const express = require('express') const app = express() // 使用鏈式語法 app.post('/user', function (req, res) { res.send('Got a POST request') }) // 使用單獨的語法 const router = express.Router() router.post('/user', function (req, res) { res.send('Got a POST request') }) app.use('/', router)
這段代碼定義了一個單獨的路由段,並將其與Express應用程序關聯起來。每當客戶端發出POST請求並匹配該路徑時,響應函數就會被調用。這個回調函數中的兩個參數,req和res,分別表示請求和響應。
二、路由路徑匹配
Express使用字元串模式匹配請求路徑。路由路徑支持多種類型的匹配。
1、字元串模式匹配
// 匹配根路徑 app.post('/', function (req, res) { res.send('root') }) // 匹配 /about 路徑 app.post('/about', function (req, res) { res.send('about') }) // 匹配 /random.text 路徑 app.post('/random.text', function (req, res) { res.send('random.text') })
2、基本參數匹配
路由路徑可以包含命名參數,以冒號(:)開頭,例如:
// 匹配 /user/123 路徑 app.post('/user/:userid', function (req, res) { res.send('user ' + req.params.userid) })
在這個例子中,請求路徑 /user/123
中的 userid 的值可以通過 req.params.userid 得到。它是一個對象,包含了一個鍵值對,其中鍵是參數名,值是請求參數。
3、正則表達式匹配
路由路徑可以包含正則表達式。例如,可以匹配所有以 /text/ 開頭的路徑的路由的路徑如下:
// 匹配任何路徑中含有 a 的路徑 app.post(/a/, function (req, res) { res.send('regex') })
三、路由處理函數
路由路徑匹配時,Express 將請求和響應對象傳遞給中間件函數。路由處理函數可以根據需要接受多個回調函數,以獲取請求和響應的處理,如下:
// 處理POST請求 app.post('/user', function (req, res) { res.send('Got a POST request') }) // 使用多個處理函數 app.post('/example/b', function (req, res, next) { console.log('第一個處理函數') next() }, function (req, res) { console.log('第二個處理函數') res.send('使用了多個處理函數') })
在這個例子中,在第一個路由處理函數中,使用了next()
函數調用了第二個路由處理函數。「next」函數被用於將控制傳遞給堆棧中下一個中間件功能。
四、請求和響應
當路由匹配時,可以使用 req 和 res 對象來處理請求和響應的信息。
1、請求對象(req)
請求對象(req)表示HTTP請求並具有請求查詢字元串,參數,正文,HTTP標頭等屬性。例如:
// 包含請求信息的JSON { "body": {}, "params": {}, "query": {}, "route": {}, "headers": {} }
其中最為常用的方法有:
req.body
– 該屬性包含提交到 POST 路由的數據,並根據 Content-Type 頭解析。使用一個中間件來處理 application/json 的 POST 數據非常常見。req.params
– 正如我們在前面的部分中看到的,包含在 URL 中的命名參數數組。req.query
– 包含以鍵值對形式的查詢字元串參數。req.route
– 當前匹配的路由的信息。req.headers
– 請求頭對象。
2、響應對象(res)
響應對象表示HTTP響應,可以將它傳遞給路由處理函數以發送響應給客戶端。
// 包含請求信息的JSON { "headers": {}, "sent": false, "status": 200, "statusCode": 200 }
其中最為常用的屬性和方法有:
res.sendFile()
– 將文件作為兌現響應發送res.json()
– 發送一個JSON響應。res.render()
– 渲染一個視圖模板。res.sendStatus()
– 設置響應狀態代碼,並將其發送。res.send()
– 向客戶端發送HTTP響應。res.status()
– 設置HTTP響應狀態碼。
五、中間件函數
中間件函數是在一個路由處理之前執行的函數,也可以在具體的路由處理函數內添加中間件。
1、使用app.use()
使用app.use()
或者router.use()
函數定義中間件函數。下面的例子展示了如何使用中間件函數處理HTTP請求日誌:
const express = require('express') const app = express() // 日誌中間件 const logMiddleware = function (req, res, next) { console.log(`${Date.now()} ${req.method} ${req.url}`) next() } app.use(logMiddleware) // GET方法路由 app.get('/user', function (req, res) { res.send('GET request to homepage') }) // POST方法路由 app.post('/user', function (req, res) { res.send('POST request to homepage') })
在這個例子中,logMiddleware
是我們定義的一個中間件函數。使用 app.use()
將其應用於所有路由。每當發出 GET或POST請求時,都會輸出請求的HTTP方法和URL。
2、在路由中使用多個中間件
此外,可以在和路由處理程序相同的回調函數中使用多個中間件,這使得很容易定義具有可重用功能的路由處理程序。下面的例子展示了如何在處理POST請求之前使用中間件驗證請求:
const express = require('express') const app = express() // 處理validate中間件 const validateUser = function (req, res, next) { req.user = { name: 'John Doe' } next() } app.use(validateUser) // POST方法路由 app.post('/user', function (req, res) { console.log(req.user) res.send('POST request to homepage') })
在這個例子中,我們定義了一個名為 validateUser
的中間件函數。它在 app.use()
中使用,以確保所有請求都被驗證。在 POST 路由中,我們可以訪問 req.user,這是從 validate 中間件中添加到請求中的。
六、總結
在 Express 中使用 router.post()
方法處理 HTTP POST 請求的步驟總結如下:
- 使用
app.post()
或router.post()
方法定義路由。 - 匹配路由路徑,根據需要使用請求對象
(req)
和響應對象(res)
。 - 如果需要,定義中間件函數使用
app.use()
或router.use()
。
通過使用這個方法,您可以更有效地處理 HTTP POST 請求,並簡化您的代碼。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249182.html