uni-app小程序頁面都需要確保登陸後,再用cookie進行數據請求

需要確保登陸後在進行數據請求,這不就是靜默登錄麼?

只有首次註冊登錄的用戶需要提供用戶信息,其他時候都是靜默登錄。

什麼叫靜默登錄?

如何實現小程序靜默登錄?一個很詳細的設計方案,值得收藏!

這篇文章值得參考。其中第四點,靜默登錄的調用時機:小程序啓動時調用和接口請求發起時調用。由於微信小程序onlaunch 不是每次都啓動的(5min 內屬於熱啓動好像),所以考慮第二種方案:只在接口請求發起時調用。

但是必須要先解決下面的問題:
  • 如果想在接口請求發起時調用,那就得把登錄流程單獨拿出來或者放到請求頁面一起。
  • 如果想在登錄完成後還能重新發起之前失敗的請求,得有callback/異步函數。
  • 如果登錄失敗了還要繼續登錄麼?
查了會資料,思考了一會,準備這樣解決:
  • 現在的請求已經是單獨封裝的了,登錄沒其他地方用到,放請求裏一起封裝
  • 異步函數用promise,成功失敗都可以有回調,而且不會亂套,按順序執行
  • 登陸失敗給個提示,簡單點。當然也可以限制登錄失敗的次數,超過X次就提示:登錄失敗,服務器問題。

於是,着手改造,最終是下面這樣:

const baseUrl = ''; 
import API from './api'

const wxLogin = (name, data, resolve) => {
    let self = this;
    uni.login({
        provider: 'weixin',
        success: function(loginRes) {
            if (loginRes.errMsg === 'login:ok') {
                request('wxlogin', {
                    code: loginRes.code
                }).then(res => {
                    if (res) {
                        //todo.....
                        resolve(request(name, data));
                       
                    } else {
                        uni.showModal({
                            content: res.msg,
                            showCancel: false
                        });
                    }

                });
            } else {
                uni.showModal({
                    content: '登陸失敗',
                    showCancel: false
                });
            }
        }
    });
};

const request = (name = '', data = {}) => {
    if (!name) {
        uni.showToast({
            title: '暫無該請求',
            duration: 2000
        });
        return;
    }
    let {
        url = '', method = 'GET'
    } = API[name];
    let header = {};
    const sessionID = uni.getStorageSync('sessionID');
    if (sessionID) {
        header['cookie'] = sessionID;
    }
    return new Promise((resolve, reject) => {
        uni.request({
            method,
            url: baseUrl + url,
            data: data,
            header: header,
            dataType: 'json',
        }).then((response) => {
            let [error, res] = response;
            if (error) {
                uni.showToast({
                    icon: 'none',
                    title: error.errMsg,
                    duration: 2000
                });
                reject(error)
            } else if (res.statusCode === 403) {
                    wxLogin(name, data, resolve)
            } else {
                if (url.indexOf('wxlogin') !== -1 && res.cookies && res.cookies[0]) {
                    const id = res.cookies[0].split(';')[0];
                    uni.setStorageSync('sessionID', id);
                }
                resolve(res.data);
            }
        }).catch(error => {
            let [err, res] = error;
            uni.showToast({
                title: '請求失敗',
                duration: 2000
            });
        })
    })
}
export default request

運行試下,靜默登錄已經實現,回調也沒有問題,有問題的是頁面存在多個請求的問題:

首頁有多個請求的時候會實現多次登錄

感覺不太好,於是就把多個請求提出一個初始請求出來,其他請求放在這個初始請求之後,就可以了。

參考資料

我們小程序頁面都需要確保登陸後,再用token進行數據請求,如何做到?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章