Coder Social home page Coder Social logo

wxapp-api-interceptors's Introduction

微信小程序api拦截器

  • 完美兼容原生小程序项目
  • 完美兼用小程序api的原本调用方式,无痛迁移
  • 小程序api全Promise化
  • 和axios一样的请求方式
  • 小程序api自定义拦截调用参数和返回结果
  • 强大的async拦截

快速开始

安装

npm install wxapp-api-interceptors --save

使用

mpvue等项目
import wxApiInterceptors from 'wxapp-api-interceptors';

wxApiInterceptors(); // 必须在调用小程序api之前调用
原生小程序和taro项目

下载该项目,解压移动文件夹distwxApiInterceptors.jsruntime.js文件到你自己的项目,详见示例

const wxApiInterceptors = require('./wxApiInterceptors');

wxApiInterceptors(); // 必须在调用小程序api之前调用

小程序api调用

不必传success、complete和fail参数。

函数式异步调用方式:
wx.showLoading({title: '登录中...'})
    .then(wx.login)
    .then(data => wx.request.post('/login', {data}))
    .then(() => wx.showToast({title: '登录成功'}))
    .catch(() => wx.showToast({title: '登录失败'}))
    .finally(wx.hideLoading);
也兼容原生的调用方式(不便维护):
wx.showLoading({
    title: '登录中...',
    success: () => {
        wx.login({
            success: (data) => {
                wx.request({
                    url: '/login',
                    data,
                    success: () => wx.showToast({title: '登录成功'}),
                    fail: () => wx.showToast({title: '登录失败'}),
                    complete: wx.hideLoading,
                });
            },
        });
    },
});

自定义拦截器

使用方法及参数:wxApiInterceptors({[api]: {[request](params):params, [response](res):res}}, [isReturn]: boolean)

比如拦截wx.showModal的confirmColor默认值为red,调用成功后并拦截调用成功返回的结果。

wxApiInterceptors({
    showModal: {
        request(params) {
            if (params.confirmColor === undefined) {
                params.confirmColor = 'red';
            }
            return params;
        },
        response(res) {
            res = '调用成功';
            return res;
        },
    }
});

wx.showModal({title: '测试'})
    .then(console.log);
// 控制的输出:调用成功

默认拦截了request api,封装成了和axios差不多的使用方式

调用wx.request[method](url, [config])发送axios化的请求。

默认GET请求
wx.request('https://test.com/banner')
    .then(({data}) => {
        console.log(data);
    })
其他请求方式
wx.request.post('https://test.com', {data: {userName: 'test'}})
    .then(({data}) => {
        console.log(data);
    })

当然也可以再继续拦截request api

比如设置request api默认的host:

wxApiInterceptors({
    request: {
        request(params) {
            const host = 'https://test.com'
            if (!/^(http|\/\/)/.test(params.url)) {
                params.url = host + params.url;
            }
            return params;
        },
    },
});

甚至可以拦截自己的业务状态码:

wxApiInterceptors({
    request: {
        response(res) {
            const {data: {code}} = res;
            // 如果data里的code等于-1就响应为失败
            if (code === -1) {
                return Promise.reject(res);
            }
            return res;
        },
    },
});

强大的async拦截器

比如调用request api的时候都在header里带上本地储存的token,没有的话从服务器获取:

wxApiInterceptors({
    request: {
        async request(params) {
            if (params.header === undefined) {
                params.header = {};
            }
            let token = wx.getStorageSync('token');
            if (!token) {
                ({data: token} = await wx.request('/getToken'));
                wx.setStorageSync('token', token);
            }
            params.header.token = token;
            return params;
        },
    },
});

原生小程序项目使用async需要特殊处理,请看示例

小程序基础版本2.0.8后的小程序,在后台配置了插件不能直接调用全局wx对象issues,需要在调用wxApiInterceptors({}, true)时传入第二个参数为true,会返回一个代理后的对象以供调用,请看示例

wxapp-api-interceptors's People

Contributors

mushan0x0 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wxapp-api-interceptors's Issues

wx.requestPayment异常

使用原生的方式,支付成功后才会进入success
使用插件方式,弹出支付框时就进入then
最开始使用的时候好像是没问题,最近测试就变成上面的情况了,不知道是不是微信改了什么机制

新版报错

const wxApiInterceptors = require('./utils/wxApiInterceptors');
wxApiInterceptors();

App({
onLaunch: function () {
wx.showLoading({ title: '登录中...' })
.then(wx.login)
},
globalData: {
}
})

Cannot read property 'then' of undefined;at App lifeCycleMethod onLaunch function

引入插件报错

[non-writable] modification of global variable "wx" is not allowed when using plugins at app.json.
console.error @ VM2122:1
set @ WAService.js:3
module.exports @ wxApiInterceptors.js? [sm]:30
(anonymous) @ app.js? [sm]:4
require @ WAService.js:19
(anonymous) @ appservice?t=1534596564626:1923

[non-writable] modification of global variable "wx.request" is not allowed when using plugins at app.json.
console.error @ VM2122:1
set @ WAService.js:3
module.exports @ wxApiInterceptors.js? [sm]:233
(anonymous) @ app.js? [sm]:4
require @ WAService.js:19
(anonymous) @ appservice?t=1534596564626:1923

@mushan0x0 请修复一下呗,用的wxParser插件引起的,微信后台添加的插件,我发现用任何插件都会报这个错误,注:是微信后台添加的插件
这个问题导致后续用您的都报错,找不到then,目前不能同时用插件和你这个,很纠结,老哥能不能尽快修复一下,急用

关于runtime对某些形式的函数申明不支持问题

不支持写法

async function sayBye () {
  await console.log('running time3');
  console.log('bye');
}

支持写法

const sayHi = async () => {
  await console.log('running time1');
  console.log('h1');
};

const sayShit = async function () {
  await console.log('running time2');
  console.log('shit');
}

浏览器支持

async function sayBye () {
  await console.log('running time3');
  console.log('bye');
}
const sayHi = async () => {
  await console.log('running time1');
  console.log('h1');
};

const sayShit = async function () {
  await console.log('running time2');
  console.log('shit');
}

建议添加lock 和 unlock

拦截请求并加上crftoken时,同时发出多请求时,也会多次请求crftoken,建议添加lock,就不需要每个请求都发出crftoken请求了,crftoken获取到后再unlock

request:fail parameter error: parameter.url should be String instead of Undefined;

在使用wx.request.post接口时报出如标题所示的错误
我的测试代码如下:
wx.request.post('http://localhost:9000/login/wxmp', {code: '12345'})
代码报错:
default
使用微信自带的wx.request是正常的
目前使用的微信调试基础库是2.0.9,本包版本1.3.2,mpvue版本1.0.12,且已经在main.js中加入了wxApiInterceptors()调用

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.