Vue使用vue-recoure + http-proxy-middleware + vuex配合promise實現基本的跨域請求封裝

来源:https://www.cnblogs.com/HMleilei/archive/2019/10/21/11712347.html
-Advertisement-
Play Games

使用vue init webpack 你的項目名稱初始化一個vue的項目 安裝依賴 npm install vue-resource http-proxy-middleware vuex koa 在項目的main.js中引入並註冊下載的依賴 在main.js中引入vue-resource並註冊到vu ...


  • 使用vue init webpack 你的項目名稱初始化一個vue的項目
  • 安裝依賴 npm install vue-resource http-proxy-middleware vuex koa
  • 在項目的main.js中引入並註冊下載的依賴
    • 在main.js中引入vue-resource並註冊到vue實例中
import VueResource from 'vue-resource'  //用來請求介面
Vue.use(VueResource)
//開啟後請求就會以application/x-www-form-urlencoded作為MIME type 就像普通的html表單一樣,form形式傳給後臺,而非JSON
Vue.http.options.emulateJSON = true;
  • 在main.js文件同級創建一個store的文件夾用來存放vuex的文件
  • 在store文件夾中創建一個index.js的文件(vue在查找時會自動查找這個文件),在文件中創建store實例並導出
   import Vue from 'vue'
   import VueX from 'vuex'
   import actions from './actions'  //這裡為了可擴展性,所以單獨創建一個文件用來存放請求方法
   
   Vue.use(VueX);
   //請求之甬道actions所以只導入了actions
   export default new VueX.Store({
       actions
   });
  • 在store文件夾中創建一個actions.js的文件用來存放請求方法

  • 配置請求代理
    • 在config文件夾下麵創建一個host.js文件用來存放開發、測試、生產的請求地址ip

    • 在文件中你可以根據條件來配置到底是開發還是測試或者是正式環境
    • let HostType = 0;  //用來判斷當前是什麼環境
      let Host = {};   //用來存儲當前環境的請求ip
      if (HostType == 0) {
          Host = { //對象內的欄位可以自定義如果整個項目只有一個後臺地址只需要一個欄位就可以;
          api: "127.0.0.1:9000",
          base: "",
          fileUp: ""
        }    
      } else if (HostType == 1) {
        Host = {
          ...
        }
      } else if (HostType == 2) {
        Host = {
          ...
        }
      }
        module.exports = Host;
    • 在config文件夾下麵創建一個proxy-table.js文件用來存放代理的配置
      const HOST = require("./HOST.js");
      
      module.exports = {
        //介面代理
        "/api/text": {
          target: HOST.api,   //需要代理到那個地址
          changeOrigin: true    //是否跨域
        },
        "/api/demo": {
          target: HOST.api,
          changeOrigin: true
        }
      }
    • 在config文件夾下麵創建一個proxy-middleware.js憑藉代理和註冊
      //導入插件
      const proxyMiddleware = require("http-proxy-middleware");
      //導入代理的配置
      const proxyTable = require("./proxy-table");
      //拿出配置代理的所有匹配的欄位
      const proxyContext = Object.keys(proxyTable);   //  ["/api/text","/api/demo"]
      
      module.exports = () => {
        //創建一個預設的配置對象
        const defautOptions = {
          changeOrigin: true,
          secure: false
        }
        //為什麼return的是一個async的方法是因為請求代理是通過伺服器進行代理的在啟動腳本中會使用koa框架來註冊這個中間件
        return async (ctx, next) => { //ctx和next都是koa框架中間件自帶的參數
          for (let context of proxyContext) {  //迴圈我們拿到的keys數組
            if (ctx.url.startsWith(context)) {  //判斷當前請求的url中是不是以拿到的keys數組中的某個值開頭的
                ctx.respond = false;  //繞開koa框架的內置response處理
                  let options = proxyTable[context];
              //如果拿取到的直接是IP地址就賦值給配置對象
                  if (typeof options === 'string') {
                  options = {
                    target: options
                  }
                }
                  //使用Object.assign()方法合併兩個對象
                  options = Object.assign({},defautOptions,options);
                  //將每一個代理都註冊,這裡必須return一個自執行函數否則代理不會設置成功
                  proxyMiddleware(context,options)(ctx.req,ctx.res, next);
            }
          }
          await next();
        }
      }
    • 在項目的更目錄中創建一個服務啟動的文件腳本名字自定義
    • //在腳本文件中導入我們需要的框架和代理配置文件
      const Koa = require("koa");  //所用的框架
      const proxy = require("./config/proxy-middleware");  //剛纔創建的代理配置文件
      //創建一個服務
      const app = new Koa();
      
      //將代理插件註冊到服務上
      app.use(proxy());  //因為我們導出的是一個方法所以需要使用調用的方式註冊
      
      //啟動服務
      app.listen(9000,() => {
        console.log("server running at http://127.0.0.1:9000");
      });
      
      //對koa框架不是熟悉的可以使用express框架 如果使用express框架拿代理就不用使用前面那樣複雜的寫法了
      const express = require("express");
      const proxy = require("http-proxy-middleware");
      
      const app = express();
      
      app.use(express.static("dist/"));
      app.use("/all", proxy({
          target: "http://127.0.0.1:3000",
          changeOrigin: true,
      }))
      
      
      app.listen(9000, (err) => {
          if (err) return console.log(err);
          console.log("app as running at http://127.0.0.1:9000");
      })

       

    • 代理配置好以後就可以寫請求方法了,在創建好的store文件夾下麵的actions文件里編寫請方法
    • //導入Vue
      import Vue from "vue"
      export default {
        //測試介面
        testInterface({},postdata) {
              //postdata是你調用的時候傳過來的參數可以更具需求拼接介面
              //let ipstr = `/api/text?id=${postdata.id}`;
            //return Vue.http.get(ipstr,{}).then(response => {
              return Vue.http.get("/api/text",{}).then(response => {
              if (response.status == 200) {
                return new Promise(response.body);
              } else {
                return new Promise(response.data.message);
              }
            })
          }
      }

       

    • 測試代理是否成功
    • <div id="app">
        <button @click="clickF">按鈕</button>
      </div>

       

    • 首先在script標簽裡面將vuex導入進來
    • import {mapActions} from "vuex";
    • 在methods中創建一個方法用來發送請求,併在methods的最下麵使用結構函數將我們存在vuex中的請求方法按需導入
    • methods: {
            clickF() {
                this.testInterface().then(data=> {
                    console.log(data);
                })
            },
            ...mapActions(["testInterface"])
        }

       

    • 直接使用this.方法名就可以訪問到vuex中的actions方法;這裡使用的是輔助函數,也可以使用原始方法
    • 在終端中使用node 啟動腳本文件的名稱 或者使用 nodemon 啟動腳本文件的名稱
    • 在瀏覽器中打開服務的地址點擊我們創建的按鈕查看請求介面
    • 可以看到我們的代理是請求成功的;狀態之所以是304是因為第二次請求的時候如果請求沒有發生改變就會使用瀏覽器緩存;
    • 上面遺留了一個bug就是這個方法只適用於build後的項目;在開發中每次都build無疑浪費了很多時間,下麵就來在開發環境中使用伺服器代理的方式完成跨域請求
    • 如果是cli創建的項目直接在config文件夾下麵的index文件中的proxyTable進行添加就可以了

 

 

      


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • js繼承機制的實現 1. 繼承的概念 1. 說明繼承的最經典的例子:幾何形狀。實際上,幾何形狀只有兩種,即橢圓形(是圓形的)和多邊形(具有一定數量的邊)。圓是橢圓的一種,它只有一個焦點。三角形、矩形和五邊形都是多邊形的一種,具有不同數量的邊。正方形是矩形的一種,所有的邊等長。這就構成了一種完美的繼承 ...
  • 使用對象屬性來調用事件處理程式,方式一 運行結果: 使用對象屬性來調用事件處理程式,方式二 運行結果: 事件處理綜合示例 運行結果: ...
  • 如今web開發中,無限載入是必需的一項功能,尤其是在移動端開發中,一個列表往往預設只載入10條,想看更多只能逐漸往下翻頁。那麼今天就看看如何在Vue-Cli中實現這個功能。 當前找到兩個插件 1 element-ui的infiniteScroll無限滾動(適合vue2,vue3) infiniteS ...
  • 1. 對象的定義 註意: 原型鏈中聲明屬性將會多個實例共用,而構造函數不會 對象的繼承 1. 對象的繼承 之 對象冒充繼承 註意: 對象冒充繼承的方法 只能 繼承對象的構造函數的屬性和方法,不能 繼承原型鏈中的函數和方法 2. 對象的繼承 之 原型鏈繼承 註意:原型鏈繼承的方法 可以 繼承對象的構造 ...
  • 本文導讀 HTML中的元素可分為兩種類型:塊級元素和行級元素。這些元素的類型是通過文檔類型定義(DTD)來指明。塊級元素:顯示在一塊內,會自動換行,元素會從上到下垂直排列,各自占一行,如p,ul,form,div等標簽元素。行內元素:元素在一行內水平排列,高度由元素的內容決定,height屬性不起作 ...
  • 方法解釋: 通過wx.previewImage預覽圖片時,會出現格式為png預覽背景為黑色時,圖片查看不清楚,能過下麵的方法轉化為白色底,方便查看 1、先用wx.getImageInfo 下載圖片到本地,並且獲取圖片的信息; 2、將圖片畫入canvas,並生成臨時圖片地址; 3、將canvas生成的 ...
  • 主要特性 使用 開發小程式,你將在小程式技術體系的基礎上獲取到這樣一些能力: 徹底的組件化開發能力:提高代碼復用性 完整的 開發體驗 方便的 數據管理方案:方便構建複雜應用 快捷的 構建機制:自定義構建策略、開發階段 hotReload 支持使用 npm 外部依賴 使用 命令行工具 vue cli ...
  • table屬性中,設置 :default-sort="{prop:'time', order:'descending'}" 1. prop為排序列,order為排列順序 2. 多級對象屬性,寫法如 :default-sort="{prop:'baseInfo.time', order:'descen ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...