先後端框架(本例中是vue和koa)如何發送請求?獲取響應?css
以及跨域問題如何解決?html
vue部分:前端
`import App from` `'./App.vue'`
`import Axios from` `'axios'`
`new` `Vue({`
`el:` `'#app'``,`
`render: h => h(App),`
`mounted(){`
`Axios({`
`method:` `'get'``,`
`url:` `'[http://localhost:3000](http://localhost:3000/)'``,`
`}).then((response) => {`
`console.log(response);`
`})`
`}`
`})`
複製代碼
koa部分:vue
`const Koa = require(``'koa'``);`
`const cors = require(``'koa-cors'``);`
`const app =` `new` `Koa();`
`const main = ctx => {`
`ctx.response.body =` `'Hello World'``;`
`};`
`app.use(cors());`
`app.use(main);`
`app.listen(3000);`
`console.log(``"服務已啓動"``);`
複製代碼
坑集錦:node
1.單純引入koa框架而且開啓服務,會出現跨域錯誤webpack
`XMLHttpRequest cannot load [http://localhost:3000/.](http://localhost:3000/) No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '[http://localhost:8080](http://localhost:8080/)';; is therefore not allowed access.`
`bundle.js:1200 Uncaught (in promise) Error: Network Error`
`at createError (bundle.js:1200)`
`at XMLHttpRequest.handleError (bundle.js:1046)`
複製代碼
2.跨域方案嘗試ios
①引入cors模塊(失敗,TypeError: res.setHeader is not a function)
`const cors = require(``'cors'``);`
`app.use(cors());`
複製代碼
②引入koa-cors模塊(成功,解決跨域問題,並正確返回數據)web
`const cors = require(``'koa-cors'``);`
`app.use(cors())`
複製代碼
|時會在新的http response的頭部信息中會新增2個字段。面試
Access-Control-Allow-Methods:GET,HEAD,PUT,POST,DELETEAccess-Control-Allow-Origin:http://localhost:8080編程
如今咱們來宏觀分析一下,跨域失敗以及成功的深層次緣由是什麼?
服務端:(http://localhost:3000)
跨域請求失敗是誰的緣由?
服務器的緣由。
爲何這麼說?
由於在服務器端引入koa-cors以前,注意,是服務器端,咱們的跨域訪問失敗。
而在服務器引入跨域請求模塊koa-cors以後,而客戶端沒有作任何改變,跨域訪問就成功了。
具體來講,就是在返回的請求頭裏加入了2個跨域請求的字段,上文也給出了詳細的HTTP定義。
一個表明支持的請求方法,本例中是get方法。
一個表明容許使用上述方法的域,本例中是http://localhost:8080。
1.那麼聰明的你就會問了,koa-cors本質上是一個node模塊,這個模塊是怎麼作到支持跨域訪問到呢?
我想koa-cors確定調用了node模塊http,其他模塊暫時未知。
2.那麼聰明的你又會想到,axios呢,它的內部工做原理是什麼?
我想確定用到了的XMLHttpRequest這個對象,基於XMR對象作了封裝,暫且知道這麼多。
3.因此說聰明的你會有一個領悟!
node模塊不止是能在服務器端調用,在客戶端也能夠調用。
說清楚一點,就是node模塊不止可以封裝node.js引擎的api,並且能封裝web V8引擎的api。
如果想問緣由的話,我想是由於node是基於V8y引擎開發的服務器環境,所以v8 api基本上是通用的,暫時這麼理解。
因此說,前端開發模塊化編程趨勢下,nodejs必需要會,由於兩者都是在強大的V8引擎驅動下工做的。
最後說個微觀的坑...
下面的代碼中,app.use(cors());必須在app.use(main);以前。
`const Koa = require(``'koa'``);`
`const cors = require(``'koa-cors'``);`
`const app =` `new` `Koa();`
`const main = ctx => {`
`ctx.response.body =` `'Hello World'``;`
`};`
`app.use(cors());`
`app.use(main);`
`app.listen(3000);`
`console.log(``"服務已啓動"``);`
複製代碼
本次給你們推薦一個交流圈,裏面歸納移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。對web開發技術感興趣的同窗,歡迎加入:582735936,無論你是小白仍是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時天天更新視頻資料。最後,祝你們早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。