在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 请求,并简化您的代码。