axios的Get和Post方法封裝及Node后端接收數據


最近有做一個Vue的小項目,其中用到了尤大大推薦使用的axios,但是使用的過程中遇到了各種各樣的問題,所以這次也是將一些心得分享出來。

安裝的流程我就簡單說一下下吧,在一個自己新建的文件夾中命令行中,輸入以下命令,當然這邊是默認大家已經安裝了node.js

 npm install vue --save 對Vue的安裝

 vue init webpack studentchoose 初始化項目,生成webpack文件,基本就默認下來就可以了

 cd studentchoose 進入此項目

 npm install 下載依賴

 npm install axios --save 下載axios並配置到package.json

 npm start 開啟服務

然后按照控制台的提示就可以看到一開始的界面了,一般默認的端口是8080

我新建了一個文件夾專門用來存放自己封裝的函數,在這里新建一個文件myRequest.js

myRequest.js

 1 import axios from "axios";
 2 import qs from "qs";
 3 export function axiosGet(url, data, callback) {
 4     console.log("get");
 5     axios
 6         .get("/api" + url, {
 7             params: qs.stringify(data)
 8         })
 9         .then(function (res) {
10             callback(res, true);
11         })
12         .catch(function (error) {
13             callback(err, false);
14         });
15 }
16 export function axiosPost(url, data, callback) {
17     axios
18         .post(
19             "/api" + url,
20             qs.stringify(data)
21         )
22         .then(function (res) {
23             callback(res, true);
24         })
25         .catch(function (error) {
26             callback(err, false);
27         });
28 } 
29 export default axiosGet

導入當然是必要的,qs.stringify()的作用是用來將數據綁到請求的url上

var a = {courseName:'jobs',age:21};

console.log(qs.stringify(a))//輸出courseName=jobs&age=21  

有的同學可能已經注意到了,我的請求的url前,還有一個"/api",這又是什么呢?這是因為axios是本身不支持跨域的,但我們日常的項目,大部分是要前后端解耦合的,所以跨域是需要考慮的部分

解決方法

進入config文件夾下的index.js,重寫dev里面的proxyTable部分,改為(初始的時候是空的)

proxyTable: {
      '/api': {
        target: 'http://localhost:5000',//設置你調用的接口和端口號
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''//用”/api“來代替target里面的地址
        }
      }
    },

然后在你調用的接口前加上“/api”就可以跨域了。

服務器端

 1 server.js
 2 var express = require("express");
 3 var app = express();
 4 const listenNumber = 5000;
 5 var course = require('../router/course')
 6 app.post("/course", (req, res) => {
 7     course.CoursePost(req,res);
 8 })
 9 
10 app.get("/course", (req, res) => {
11     course.CourseGet(req,res);
12 })
13 
14 app.listen(listenNumber)

然后下面是我的router文件(說是函數封裝也OK誒)

 1 var formidable = require("formidable");
 2 var url = require('url');
 3 
 4 var CoursePost = function (req, res) {
 5     var form = new formidable.IncomingForm();
 6     form.parse(req, (err, fields, files) => {
 7         console.log(fields)
 8         res.json(fields);
 9     });
10 }
11 
12 
13 var CourseGet = function (req, res) {
14     let params = url.parse(req.url, true).query[0];
15     let Arr = params.split("&");
16     let resultObj = {}; 
17     for(item of Arr){
18         let key = item.split("=")[0];
19         let value = decodeURI(item.split("=")[1]);
20         resultObj[key] = value;
21     }
22     res.json(resultObj);
23 }
24 
25 module.exports.CoursePost = CoursePost;
26 module.exports.CourseGet = CourseGet;

這里POST的話我使用的是formidable進行表單的處理,而Get請求有些奇怪,大家可以試着傳中文字符串過去,其實是會被轉碼的

就像     %e4%b9%94%e5%b8%83%e6%96%af    這樣

一開始我以為是BUG,后來才知道是為了字符串中的特殊字符不會引起歧義,所以這里我們將每一個value都要進行進行decodeURL()進行轉碼。

最后插一句,formidable也是要 npm install formidable進行安裝的,node服務這邊我講得比較散,大家有什么建議都可以和我提,加油


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM