Node Express获取参数的几种方式

Node配合Express框架获取参数主要有以下4种形式:

  • req.body
  • req.params
  • req.param()
  • req.query

那么,以上几种形式获取参数的值适用于什么情景呢?这4种获取参数值的方式各有什么区别和联系呢?

适用情景案例

req.body

req.body官方文档是没有提供的,但是它也是很好用的获取表单参数的方法。req.body配合Express中间件bodyParser()中间件提供的。当bodyParser()中间件使用后,这个对象默认为 {},req.body可以获取到post到body中的内容。
举个栗子:

1
2
3
app.post('/user/signup',function(req,res){
var _user = req.body.user;
})
1
2
3
4
5
6
7
8
9
10
// POST user[name]=tobi&user[email]=tobi@learnboost.com
req.body.user.name
// => "tobi"
req.body.user.email
// => "tobi@learnboost.com"
// POST { "name": "tobi" }
req.body.name
// => "tobi"

req.params

这是一个数组对象,命名过的参数会以键值对的形式存放。 比如你有一个路由/user/:name, name属性会存放在req.params.name. 这个对象默认为 {}.
举个栗子:

1
2
3
4
5
6
7
// GET /user/tj
req.params.name
// => "tj"
app.post('/user/signup/:userid',function(req,res){
req.params.userid;
})

当使用正则表达式定义路由的时候,req.params[N]会是这个应用这个正则后的捕获分组, N是代表的是第N个捕获分组。这个规则同样适用于全匹配的路由,如 /file/*

1
2
3
// GET /file/javascripts/jquery.js
req.params[0]
// => "javascripts/jquery.js"

req.param(name)

req.param()req.queryreq.body、以及req.params获取参数的三种方式的封装。req.param(name)返回name参数的值。
举个栗子:
和上面的req.body方法类似

1
2
3
4
5
6
7
8
9
10
11
12
13
// POST name=tobi
app.post('/user?name=tobi',function(req,res){
req.param('name');
// => "tobi"
})
// ?name=tobi
req.param('name')
// => "tobi"
// /user/tobi for /user/:name
req.param('name')
// => "tobi"

req.query

这是一个解析过的请求参数对象,默认为{}.
举个栗子:

1
2
3
4
5
6
7
8
9
10
11
12
13
// GET /search?q=tobi+ferret
req.query.q
// => "tobi ferret"
// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order
// => "desc"
req.query.shoe.color
// => "blue"
req.query.shoe.type
// => "converse"

区别与联系

总结出以下4点:
1、对于path中的变量,均可以使用req.params.xxxxx方法
2、对于get请求的?xxxx=,使用req.query.xxxxx方法
3、对于post请求中的变量,使用req.body.xxxxx方法
4、以上三种情形,均可以使用req.param()方法,所以说req.param()req.queryreq.body、以及req.params获取参数的三种方式的封装。

参考资料