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 <script> 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 </script>
后台代碼:
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 <script> 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 </script>
后台代碼:
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=222
req.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 <body> 2 <form action="/body" method="post"> 3 <input type="text" name="username" value="123"> 4 <input type="password" name="pwd" value="123"> 5 <input type="submit"> 6 </form> 7 </body>
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