在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/n/249182.html