npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

we-req

v1.0.2

Published

weReq是基于微信小程序的 wx.request的高级封装,提供全局和外部拦截器的管理,支持自动登录等功能,旨在简化微信小程序网络请求的处理流程,提升开发者的使用体验。

Downloads

134

Readme

weReq

weReq是什么

weReq 是基于微信小程序的 wx.request 的高级封装,提供全局和外部拦截器的管理,支持自动登录等功能,旨在简化微信小程序网络请求的处理流程,提升开发者的使用体验。

特性

  • 支持 Promise API:该类支持 async/awaitthen,使得异步操作更加简洁,避免了回调地狱的复杂性,提升了代码可读性。
  • 拦截请求和响应:内置多种拦截器机制允许开发者在请求和响应阶段进行一系列处理,仅返回业务数据,简化了对返回信息的操作。
  • 自带 Loading:基于微信的wx.showLoading的方法在发起请求时自动显示加载提示,确保请求完成后自动隐藏,提升交互体验。
  • 自动登录:在登录态过期时,系统会自动尝试重新登录,整个过程对开发者是透明的,无需手动处理,对用户是无感知的,提高了用户体验。

下载与安装

源码下载引入

步骤1:点击这里下载 weReq 源码,将解压后的文件夹中的weReq.min拷贝到小程序项目中的 utils 目录下。引用 weReq 并初始化。

步骤2:import Request from '../utils/weReq.min.js';

npm安装

使用 npm 构建前,请先阅读微信官方的 npm 支持

步骤1:npm install we-req

步骤2: 构建 npm,点击开发者工具中的菜单栏:工具 --> 构建 npm

步骤3:完成前两步骤就可以引入啦,import Request from 'we-req'

使用示例

import Request from 'we-req';  //或者 import Request from '../utils/weReq.min.js';
const weReq = Request.init({
  baseURL: 'https://api.example.com',
  timeout:3000,
  ...
});
// 发起 GET 请求
weReq.get({ url: '/endpoint' })
  .then(response => {
    console.log(response);
  })
  .catch(error => {
    console.error(error);
  });

// 发起 POST 请求
weReq.post({ url: '/endpoint',data:{name:"我是小明"} })
  .then(response => {
    console.log(response);
  })
  .catch(error => {
    console.error(error);
  });

更多丰富示例可以查看demo,链接quick-start

weReq API

创建一个实例

import Request from 'we-req'
const weReq = Request.init({
  baseURL: BASE_URL,
  timeout: TIME_OUT,
  ...config
})

实例方法

以下是可用的实例方法,实例方法的配置将与实例的配置合并,如果有相同的字段,实例方法传过来的字段替换实例方法的字段。

weReq#request(config)

weReq#get(config)

weReq#delete(config)

weReq#post(config)

请求配置(config)

部分参数请参考小程序本身配置, 传送门

| 参数 | 类型 | 默认值 | 必填 | 说明 | | ------------- | ------------------------- | ---------------- | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | url | string | | 是 | 开发者服务器接口地址 | | data | string/object/ArrayBuffer | | 否 | 请求的参数 | | baseURL | string | | 否 | 会自动添加到 url 前,除非 url 是一个绝对 URL,它可以通过设置一个 baseURL 便于后面的请求方法传递相对 URL,不用每次请求带上域名。 | | timeout | number | 3000 | 否 | 超时时间,单位为毫秒。默认值为 60000 | | method | string | GET | 否 | HTTP 请求方法 | | headers | object | application/json | 否 | 请求发送时候的请求头 | | loading | boolean/string | false | 否 | 请求过程页面是否展示全屏的加载框,默认文字是加载中,当值为字符串时,将替换loading的文字 | | interceptors | object | false | 否 | 拦截器,在请求前或响应的时候对数据做拦截,可以对请求参数做一些处理或对响应数据做处理,比如:自定义加载框、发送前可以对 config 进行修改、在收到响应后可以对 res 进行处理或转换等。 | | reLoginConfig | object | false | 否 | 登录管理器,对一些开发者,需要拿到小程序登录凭证,带到给服务器结合并返回服务器的数据做处理,当session_key过期的时候会自动登录,并重新请求session_key过期的时候的网络请求,做到用户无感知登录过程。 |

全屏加载框(loading)

简单来说,减少每次网络请求前,都要手写一遍,网络正在加载中。

示例代码

import Request from 'we-req'
const weReq = Request.init({
  baseURL: 'https://wx.mock.com/api/',
  timeout: 3000,
  //开启全局加载弹窗
  loading: true
})

//发起 POST 请求,自带加载框
weReq
  .post({
    url: '/endpoint',
    data: {
      name: '我是小明'
    }
  })
  .then((response) => {
    console.log(response)
  })
  .catch((error) => {
    console.error(error)
  })

// 当我某个请求突然不想用全局加载框了,也可去掉
weReq
  .post({
    url: '/endpoint',
    loading: false,
    data: {
      name: '我是小明'
    }
  })
  .then((response) => {
    console.log(response)
  })
  .catch((error) => {
    console.error(error)
  })

拦截器(interceptors)

拦截器,顾名思义,在请求前或响应的时候对数据做拦截,可以对请求参数做一些处理或对响应数据做处理,比如:实现自定义加载框、发送前可以对 config 进行修改、在收到响应后可以对 res 进行处理或转换等。

interceptors参数对象说明

| 参数 | 类型 | 默认值 | 必填 | 说明 | | ----------------- | -------- | ------ | ---- | -------------- | | requestSuccessFn | Function | | 否 | 请求前拦截器 | | requestFailFn | Function | | 否 | 请求失败拦截器 | | responseSuccessFn | Function | | 否 | 响应成功拦截器 | | responseFailFn | Function | | 否 | 响应失败拦截器 |

示例代码

import Request from 'we-req';
const weReq =  Request.init({
  baseURL: 'https://wx.mock.com/api/',
  timeout: 3000,
  interceptors: {
  // 请求成功拦截器
  requestSuccessFn: (config) => {
    // 在请求发送前可以对 config 进行修改
    return config;
  },
  // 请求失败拦截器
  requestFailFn: (err) => {
    // 可选:处理请求失败的情况,如记录日志或提示用户
  },
  // 响应成功拦截器
  responseSuccessFn: async (res) => {
    // 在收到响应后可以对 res 进行处理或转换
    return res;
  },
  // 响应失败拦截器
  responseFailFn: (err) => {
    // 可选:处理响应失败的情况,如显示错误信息或重试请求
  },
});

自动登录(autoLoginConfig)

简单来说,小程序登录是通过 code 换取 session_key 的过程,过通过 Header 携带 sessionId发送后端

session_key 过期时,我们需要用新的 code 获取新的 session_key,然后继续发起请求。

那么,问题来了,因为每个请求都需要携带 session_key,如果用户在访问某个页面的时候时突然 session_key 过期了,那该页面数据就获取不了了,无法渲染,页面出现空白,在这种情况下,我们需要重新获取用户的 code,以换取新的 session_key,并重新获取页面数据的方法,重新渲染页面数据。

weReq 的自动登录就是为此而生,我们约定登录过期状态(默认是 res.code === -220,可根据服务器判断调整),当检测到过期时,weReq 会自动调用 wx.login 重新获取 code,再通过 code 调用登录接口获取新的 sessionId,通过 Header 携带 sessionId,最后重新发起sessionId过期之前的所有网络的请求。

这样,用户将无感知地自动登录,并自动重新调用该网络请求,这些操作都不用自己重新写是不是很方便哩。

autoLoginConfig参数对象说明

| 参数 | 类型 | 默认值 | 必填 | 说明 | | ---------------- | -------- | ------ | ---- | -------------------------------------------------------------------------------------------------------------------------------------------- | | reTokenConfig | Object | | 是 | 当token过期的时候,调用该方法,这里是填调用该方法的配置 | | isTokenExpiredFn | Function | | 是 | 判断token过期的状态码,这个根据自己服务器代码返回来判断,举例我这边的的状态码为-220为过期,当所请求返回-220的时候则会自动调用登录网络请求接口 | | reLoginLimit | Number | 3 | 否 | 当重试请求登录接口返回失败次数超过这个次数,将不再重试登录请求。 |

reTokenConfig参数对象说明

| 参数 | 类型 | 默认值 | 必填 | 说明 | | ------- | -------- | ------ | ---- | ------------------------------------------------------------------------------------------------------------------------------------------ | | url | String | | 是 | 获取token的网络请求url ,它可以通过设置一个 baseURL 便于后面的请求方法传递相对 URL,不用每次请求带上域名,如果是绝对url将默认以绝对url优先 | | method | Function | | 是 | GET|POST,如果是GET请求,code将会自动拼接到url后面,如果是POST请求将会放入data传到后端 | | codeKey | String | code | 否 | 决定你的code传入的key的变量名字,如GET请求时/code?=123456,POST请求为{code:"123456"} | | data | Object | | 否 | 其他参数 | | success | Function | | 否 | 请求成功的回调,可在此存储你需要的业务,如:存储token到本地存储 |

示例代码

import Request from 'we-req'
const weReq = Request.init({
  baseURL: 'https://wx.mock.com/api/',
  //获取本地token,放到请求拦截器,每次网络请求前带上token
  interceptors: {
    requestSuccessFn: (config) => {
      const key = wx.getStorageSync('token')
      config.header = {}
      config.header.Authorization = `Bearer ${key}`
      config.data = {
        ...config.data
      }
      return config
    }
  },
  reLoginConfig: {
    // 当token过期的时候刷新token并存储到本地
    reTokenConfig: {
      url: '/refresh_token',
      method: 'POST',
      data: {},
      success: (res) => {
        // 根据自己服务器返回数据实现自己的业务
        if (res.data.data.token) {
          wx.setStorageSync('token', res.data.data.token)
        }
      }
    },
    // 判断网络请求token过期的状态码,这个根据自己业务代码返回来判断,我这边的状态码为-220为过期,则会自动刷新token
    isTokenExpiredFn: (res) => {
      return res.code === -220
    }
  }
})

demo

更多丰富示例可以查看demo,链接quick-start