0.2.6 • Published 1 year ago

@kcuf/fetcher-interceptor-login v0.2.6

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

@kcuf/fetcher-interceptor-login

无感登录是很常见的需求。

利用该拦截器,可以对需要登录的特定错误进行登录后重新发起请求,实现丝滑的登录流程。

前提

拦截器内部会判断 error.nameerror.code,只有业务错误才会继续处理登录逻辑,因此需要 @kcuf/fetcher-interceptor-biz

使用

import interceptLogin from '@kcuf/fetcher-interceptor-login';

import needLogin from './need-login';
import doLogin from './do-login';

interceptLogin(fetcher, {
  needLogin,
  doLogin,
  headerKeys
});

由于业务的特殊性,你需要自定义 needLogindoLogin 以及可选的 headerKeys

needLogin

function needLogin(code: string, error: FetcherError): boolean;

doLogin

function doLogin(): Promise<void>;

这是一个无参的返回 Promise<void> 的方法,一般来说对弹窗登录的 Promise 封装。

headerKeys

使用 Cookie 的情况不需要。

注意:如果登录用的 不是 Cookie,而用的是 Header 的话,需要在重试请求前将原请求 config.headers 中对应的值清掉。

这是由于 Fetcher 拦截器放的 header、params、body 等优先级不能比传入值高,而前一次由拦截器混入的 headers 在重试的二次 请求中,地位变成了传入值。

解决的办法是,使用 fetcher 提供的帮助方法 deleteConfigHeaders 在二次调用前清除相应的 header(可能有多个),这里提供了简便的配置属性 headerKeys

FAQ

❓登录窗怎么实现?

由于需要的是 Promise,你需要使用命令式的弹窗,而不应该是组件式。比如 @kcuf/rc-dialog 的命令式弹窗就很强。

❓登录窗登录成功,需要做什么?

登录成功,一般是设置 Cookie 或者 localStorage 存取用户登录相关的信息。如果是 Cookie 的话,一般不需要在做什么,因为 fetch 会默认带 Cookie 的, 如果记录到 localStorage 的,你需要写一个请求公共信息的拦截器(使用 fetcher.interceptRequest)。

❓多个接口同时报错要登录,会不会同时出现多个登录窗?

不会。内部对 doLogin 做了单例包裹,不会有这样的事情发生,只要登录未完成,就会在当前的登录队列中增加回调,而不会多弹窗。

❓登录窗可否取消登录?

可以,但取消登录后,错误就会变性,error.name 会变,error.code 不变,并且此次接口调用最终为失败。

建议在用户完成登录前,不允许用户关闭或取消。

0.2.1

1 year ago

0.1.2

1 year ago

0.2.0

1 year ago

0.1.1

1 year ago

0.2.6

1 year ago

0.2.3

1 year ago

0.2.2

1 year ago

0.2.5

1 year ago

0.2.4

1 year ago

0.1.0

2 years ago