闽公网安备 35020302035485号
社交互动:产品可以提供用户之间的联动, 使用户之间更有互动感,也可以增加产品的辐射。


const login = async() {
const { code, errMsg } = await wx.login();
// 通过接口服务端调用微信服务端接口获取用户标识,获取用户信息
const user = await loginFunc(code);
}
自动刷新Token/**
* 匹配状态码
* @param response
* @param statusCode
*/
const matchStatusCode = (response, statusCode) => {
return [response.status, response.data.code].includes(statusCode);
};
/**
* 堆代码 duidaima.com
* 是否需要重试接口
* @param error
* @param updateConfig
*/
const whetherToRetry = async (error, updateConfig) => {
const { user } = rootStore; // 全局变量
if (
!matchStatusCode(error?.response, 401) || // 去除401以外的错误
user.isLogout || // 用户主动退出登录
error?.config?.meta?.reTry === false // 某些特殊场景不需要刷新token
)
return false;
await resetUser(); // 重置用户信息(重新获取token)
if (!user.token) return false; // 获取新token失败则中断
updateConfig({ // 更新token后重试接口
headers: {
Authorization: `Bearer ${user.token}`,
},
});
return true;
}
/**
* 重置用户
*/
const resetUser = async () => {
const { user, common } = rootStore;
if (user.isLogin) {
await user.refreshToken();
} else {
await silentLogin(); // 静默登录
}
};
现在就完成了第一步,自动刷新了Token。
/**
* 重置用户
*/
const resetUser = async () => {
const { user, common } = rootStore;
if (!user.userInited)
return new Promise((resolve) => {
common.setRequestQueue([...common.requestQueue, resolve]);
});
user.setUserInited(false);
if (user.isLogin) {
await user.refreshToken();
} else {
await silentLogin();
}
user.setUserInited(true);
};
constructor() {
reaction(
() => this.userInited,
(arg) => {
if (arg) {
const { common } = rootStore;
common.requestQueue.forEach((item) => item()); // 执行等待队列
common.setRequestQueue([]);
}
}
);
}
前置等待用户信息完成
/**
* 等待初始化用户结束
*/
const waitForUserInited = async () => {
const { user, common } = rootStore;
if (user.userInited) return Promise.resolve();
// 未初始化则将请求阻塞在队列中
return new Promise((resolve) => {
common.setRequestQueue([...common.requestQueue, resolve]);
});
};
http.tap('request', async (config) => {
const { user } = rootStore;
// 需要授权接口
if (!NO_AUTH_URL.includes(config.rawURL)) {
await waitForUserInited();
config.headers.Authorization = `Bearer ${rootStore.user.token}`;
}
// ....
}
总结