1、原生node中怎么获取get/post请求参数
1.1 处理get请求参数
使用node自带的核心模块----url模块
url.parse();方法将一个完整的URL地址,分为很多部分,常用的有:host、port、pathname、path、query。第一个参数是地址,第二个参数默认是false,设置为ture后,将字符串格式转换为对象格式。字符串(“a=1&b=2”)转换为了对象格式({a: 1,b: 2})。
代码:
1 var urlObj = url.parse(req.url ,true);
2 var query = urlObj.query;
1.2 处理post请求参数
POST请求一般会提交数据给服务器,服务器在接收数据的时候也是分块接收的;
要想获得post参数对象,需要用到第三方包querystring
代码:
1 const http = require('http');
2 const server = http.createServer();
3 server.listen(3000, () => console.log('启动了'));
4
5 // 只要有浏览器发来请求,就会触发下面的事件
6 server.on('request', (req, res) => {
7 // console.log('123');
8 // console.log(req.method); // POST
9 // POST请求,意思是浏览器提交数据给服务器
10 // 服务器肯定要接收这些数据,并把这些数据保存
11 // 如何接收POST提交过来的数据
12 /**
13 * 1. 给req注册data事件,当有数据提交过来就会触发,事件的作用是接收数据,接收大量数据的时候,是分块接收的
14 * 2. 给req注册end事件,当数据全部接收完毕,会触发
15 */
16 // 先定义一个空字符串,里面准备存放接收到的数据
17 let str = '';
18 req.on('data', (chunk) => {
19 str += chunk; // 把接收到的一块数据拼接到str中
20 });
21 req.on('end', () => {
22 console.log(str); // id=1&name=zs&age=43
23 // 将接收到的数据,赋值给req.body
24 // req.body属性本来不存在,是自定义的,你也可以用其他的名字
25 req.body = querystring.parse(str); // querystring.parse是将字符串转成对象{id:1,bane:zs,age:43}
26 });
27
28 });
2、express框架中获取请求的参数方法
2.1 req.body
通常用来解析POST请求中的数据 req.body不是nodejs默认提供的,需要载入中间件body-parser中间件才可以使用req.body 例如前台代码:
1
2 $('.btn-save').click(function (e) {
3 e.preventDefault();
4 var fd = new FormData($('form')[0]);
5
6 $.ajax({
7 type: 'post',
8 url: '/updateHero',
9 data: fd,
10 dataType: 'json',
11 success: function (res) {
12 console.log(res);
13
14 alert(res.message);
15 if (res.code == 200) {
16 location.href = './index.html'
17 }
18 },
19 processData: false,
20 contentType: false
21 })
22 })
23
后台代码:
1 app.post('/updateHero', upload.single('heroIcon'), function (req, res) {
2 // console.log(req.body);
3 // console.log(req.file);
4 // return;
5 let id = req.body.id;
6 // 如果id为空或者不是数字类型的时候,参数错误,给出提示
7 if (!id || isNaN(id)) {
8 res.send('参数错误');
9 return;
10 }
11 let sql = 'update heroes set ? where id = ?';
12 let values = {
13 name: req.body.heroName,
14 nickname: req.body.heroNickName,
15 skill: req.body.skillName,
16 }
17 // 如果图片没有改动req.file的值为undefined,所以需要单独判断
18 if (req.file) {
19 values.file = req.file.path
20 }
21 db(sql, [values, id], (err, result) => {
22 if (err) {
23 res.send({ code: 201, message: '修改失败' });
24 } else {
25 res.send({ code: 200, message: '修改成功' });
26 }
27 })
28 })
2.2 req.query
由nodejs默认提供,无需载入中间件,此方法多适用于GET请求,解析GET请求中的参数 包含在路由中每个查询字符串参数属性的对象,如果没有则为{} 举例前台代码:
1
2 // 获取地址栏的id
3 var id = location.search;
4 // 发送ajax请求到/getHeroById端口,获取信息
5 $.get('/getHeroById' + id, function (res) {
6 $('#heroName').val(res.name);
7 $('#heroNickName').val(res.nickname);
8 $('#skillName').val(res.skill);
9 $('.preview').attr('src', res.file);
10 $('input[type=hidden]').val(res.id);
11 })
12
后台代码:
1 app.get('/getHeroById', (req, res) => {
2 let id = req.query.id;
3 // 如果id为空或者不是数字类型的时候,参数错误,给出提示
4 if (!id || isNaN(id)) {
5 res.send('参数错误');
6 return;
7 }
8 let sql = 'select * from heroes where id=?'
9 db(sql, id, (err, result) => {
10 if (err) throw err;
11 res.send(result[0]); // result的值是一个数组
12 })
13 })
2.3 req.params
nodejs默认提供,无需载入其他中间件
req.params包含路由参数(在URL的路径部分),而req.query包含URL的查询参数(在URL的?后的参数)。
例如,如果你有route/user/:name,那么“name”属性可作为req.params.name。
post和get方式提交的表单的参数的获取,都可用req.params获取,但是需要注意的是:假设现在我们以Post方式提交表单到 /user/signup?123userid=222,在后台我们要获取到userid这个参数
这时如果我们通过req.params.userid获取到的并不是post表单提交上来的参数,因为req.params包含路由参数(在URL的路径部分),所以它在解析参数的时候包含URL中的路由,它获取的顺序是:1.url中路由参数2.post请求中提交参数3.get请求中的参数这里获取到的是123,
如果提交的路径为:/user/signup?userid=222req.params.userid获取到的就是post提交的参数
3、示例
3.1 获取get请求的参数值(req.query)
1 router.get('/query', function (req, res,next) {
2 console.log('get请求参数 :',req.query);
3 console.log('post请求参数 :',req.body);
4 });
访问http:/127.0.0.1:4000/query?username=123&pwd=456
3.2 获取post请求的参数值(req.body)
html代码:
1
2
7
js代码:
1 app.post('/body', function (req, res, next) {
2 console.log('get请求参数 :',req.query);
3 console.log('post请求参数 :',req.body);
4 });
3.3 获取url路径(req.params)
1 app.get('/test/:urlname', function (req, res,next) {
2 console.log('url参数 :',req.params);
3 console.log('get请求参数 :',req.query);
4 console.log('post请求参数 :',req.body);
5 });
访问:http://127.0.0.1:4000/test/1234