uniAPP跨域問題解決

利用node.js搭建服務(wù)端

一拟逮、新建項目目錄并且利用node.js初始化項目 (截圖)

image.png

二忽孽、新建一個入口文件 index.js (截圖)

image.png

三吕晌、安裝一個express依賴 (截圖)

image.png

如果安裝太慢悦即,建議將npm registry更改為淘寶鏡像瓢捉。

1、臨時使用

npm --registry https://registry.npm.taobao.org install express

2兴革、永久使用

npm config set registry https://registry.npm.taobao.org

配置后可通過下面方式來驗證是否成功:

npm config get registry
image.png

四绎晃、配置入口文件(index.js)并啟用服務(wù)器

1、配置入口文件(index.js)

//(1)引入express
const express=require("express"); 

//(2)實例化
const app=express(); 

//(3)監(jiān)聽一個端口3000
app.listen(3000,()=>{//為了監(jiān)聽服務(wù)正在運行杂曲,在控制臺打印一個內(nèi)容
    console.log("----------api 3000-------------")
})

//(4)請求一個路由 "/api/list"
app.get("/api/list",(req,res)=>{
    var arr = ["北京","上海","廣州","深圳","安徽合肥"];
    res.json(arr);   //返回請求結(jié)果
})

啟動服務(wù)端(命令截圖)

image.png

這里使用 node-dev命令啟動服務(wù)庶艾,如果沒有安裝,可先使用命令全局安裝一下擎勘,“npm i node-dev -g” 咱揍。

訪問測試(截圖)

image.png

拓展:從APP項目(前端)如何訪問服務(wù)器?

說明:

APP項目地址及端口是:localhost:8081
服務(wù)器地址及端口是:localhost:3000
地址或者端口不同棚饵,就會涉及跨域問題煤裙。解決跨域問題掩完,可從服務(wù)器端或者項目前端解決。

1硼砰、demo.vue 代碼如下:

<template>
    <view class="content">
        <h1>demo頁面</h1>
        
        <view class="btn">
            <button type="primary" @click="myClick">請求數(shù)據(jù)</button>
            <text>從node服務(wù)器上請求數(shù)據(jù),只要域名或者ip不同或者端口號不同且蓬,都涉及<text class="orangered">跨域</text>問題。</text>
        </view>
        
        <!-- 將拿到的數(shù)據(jù)渲染到頁面题翰,循環(huán)遍歷數(shù)組 -->
        <view>
            <text  v-for="(item,index) in list" :key="index">{{item}}</text>
        </view>
    </view>
    
</template>

<script>
    export default {
        data() {
            return {
                list:[] //城市列表
            }
        },
        methods: {
            myClick(){
                uni.request({
                    url:"http://localhost:3000/api/list",
                    success:res=>{
                        console.log(res);
                        var list = res.data; 
                        this.list = list;
                    }
                })
            }
        }
    }
</script>

<style>
    .content{
        padding: 20rpx;
    }
    .btn{
        margin: 20rpx 0;
    }
    h1{
        background-color: yellow;
        text-align: center;
    }
    .orangered{
        background-color: orangered;
        color: white;
        padding: 0 10rpx;
    }
    text{
        display: inline-block;
        background-color: deepskyblue;
        padding: 10rpx 20rpx;
        margin: 20rpx;
        border-radius: 10rpx;
        color: white;
    }
</style>


運行到微信開發(fā)工具恶阴,點擊請求按鈕,控制臺打印輸出結(jié)果豹障》胧拢——成功獲取數(shù)據(jù)

image.png

運行到H5端,報錯血公!因為存在跨域問題昵仅。如下圖所示:

image.png

解決跨域問題的兩種方法:

1、服務(wù)器端解決方法

步驟:

(1)服務(wù)器端安裝 cors

image.png
image.png

(2)配置index.js文件(引入cors并使用cors)

image.png

node項目的index.js 代碼如下:

//1引入express
const express=require("express"); 

//引入 cors
const cors=require("cors");

//2實例化
const app=express(); 
app.use(cors()); //注意 cors() 有括號

//3監(jiān)聽一個端口3000
app.listen(3000,()=>{//為了監(jiān)聽服務(wù)正在運行累魔,在控制臺打印一個內(nèi)容
    console.log("----------api 3000--------------")
})

//4請求一個路由 "/api/list"
app.get("/api/list",(req,res)=>{
    var arr=["北京","上海","廣州","深圳","安徽合肥"];
    res.json(arr); //返回請求結(jié)果
})


(3)H5端測試請求數(shù)據(jù)——成功請求到數(shù)據(jù)

image.png

注意:

因為有緩存的原因摔笤,即使服務(wù)器端關(guān)閉 cors 引入和使用,已經(jīng)訪問的數(shù)據(jù)依然能夠再次被看到垦写〖耄可以通過清除瀏覽器緩存的方法,清除 訪問到本地的數(shù)據(jù)梯澜。

2、前端解決方法—— 配置代理渴析,解決跨域

(1)先關(guān)閉 cors 服務(wù)

image.png

(2)配置APP項目中 manifest.json 文件晚伙,設(shè)置代理規(guī)則。(參照: webpack.config.js)

image.png
image.png

注意:每次修改 manifest.json 之后都要重啟服務(wù)俭茧。

APP項目中 manifest.json文件關(guān)于H5端代碼如下:

 "h5" : {
        "title" : "H5",
        "devServer": {
            "proxy":{
                //配置代理:只要 遇到 /api 都改為  http://localhost:3000
                "/api":{
                    "target":"http://localhost:3000"
                }
            }
        }
    }

(3)重啟H5端服務(wù)(重新運行)

image.png

至此咆疗,H5端就可以順利訪問服務(wù)器的數(shù)據(jù)

但是,小程序端又又不可以訪問了母债,接下來繼續(xù)優(yōu)化并解決小程序端的訪問午磁。

(4)利用平臺判斷 完善demo.vue

image.png

APP項目的demo.vue 代碼如下:

<template>
    <view class="content">
        <h1>demo頁面</h1>
        
        <view class="btn">
            <button type="primary" @click="myClick">請求數(shù)據(jù)</button>
            <text>從node服務(wù)器上請求數(shù)據(jù),只要域名或者ip不同或者端口號不同,都涉及<text class="orangered">跨域</text>問題毡们。</text>
        </view>
        
        <!-- 將拿到的數(shù)據(jù)渲染到頁面迅皇,循環(huán)遍歷數(shù)組 -->
        <view>
            <text  v-for="(item,index) in list" :key="index">{{item}}</text>
        </view>
    </view>
    
</template>

<script>
    export default {
        data() {
            return {
                list:[] //城市列表
            }
        },
        methods: {
            myClick(){
                var url = "/api/list";  //先給 url設(shè)置默認(rèn)值
                // 平臺判斷 - 如果不是H5 則  url = "http://localhost:3000/api/list"
                // #ifndef H5   
                    var url = "http://localhost:3000/api/list"
                // #endif
                
                uni.request({
                    // url:"http://localhost:3000/api/list",
                    // url:"/api/list",
                    url:url,
                    success:res=>{ //請求成功時,執(zhí)行以下代碼
                        console.log(res);
                        var list = res.data; 
                        this.list = list;
                    },
                    fail:err=>{ //請求失敗時衙熔,執(zhí)行以下代碼
                        console.log(err)
                    }
                })
            }
        }
    }
</script>

<style>
    .content{
        padding: 20rpx;
    }
    .btn{
        margin: 20rpx 0;
    }
    h1{
        background-color: yellow;
        text-align: center;
    }
    .orangered{
        background-color: orangered;
        color: white;
        padding: 0 10rpx;
    }
    text{
        display: inline-block;
        background-color: deepskyblue;
        padding: 10rpx 20rpx;
        margin: 20rpx;
        border-radius: 10rpx;
        color: white;
    }
</style>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末登颓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子红氯,更是在濱河造成了極大的恐慌框咙,老刑警劉巖咕痛,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異喇嘱,居然都是意外死亡茉贡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門者铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腔丧,“玉大人,你說我怎么就攤上這事王暗』诰荩” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵俗壹,是天一觀的道長科汗。 經(jīng)常有香客問我,道長绷雏,這世上最難降的妖魔是什么头滔? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮涎显,結(jié)果婚禮上坤检,老公的妹妹穿的比我還像新娘。我一直安慰自己期吓,他們只是感情好早歇,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讨勤,像睡著了一般箭跳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潭千,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天谱姓,我揣著相機與錄音,去河邊找鬼刨晴。 笑死屉来,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狈癞。 我是一名探鬼主播茄靠,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝶桶!你這毒婦竟也來了嘹黔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎儡蔓,沒想到半個月后郭蕉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡喂江,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年召锈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获询。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡涨岁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吉嚣,到底是詐尸還是另有隱情梢薪,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布尝哆,位于F島的核電站秉撇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏秋泄。R本人自食惡果不足惜琐馆,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恒序。 院中可真熱鬧瘦麸,春花似錦、人聲如沸歧胁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喊巍。三九已至了赌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玄糟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工袄秩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阵翎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓之剧,卻偏偏與公主長得像郭卫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子背稼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容