最近有做一個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服務這邊我講得比較散,大家有什么建議都可以和我提,加油