uni-app中如何检查用户token是否已过期或者无权限,是每个云对象都要加这些判断吗
uni-app中如何检查用户token是否已过期或者无权限,是每个云对象都要加这些判断吗
项目详情
开发环境、版本号、项目创建方式
项⽬目创建方式 | 开发环境 | 版本号 |
---|
1 回复
在uni-app中,为了检查用户的token是否已过期或者用户是否无权限,通常需要在每个请求云对象之前进行验证。虽然每个云对象都添加验证逻辑显得重复,但可以通过封装请求函数来简化这一过程。以下是一个使用async/await
和Promise
进行token验证的示例,展示了如何在一个集中位置处理这些验证逻辑,而不是在每个云对象中重复。
1. 封装请求函数
首先,我们创建一个封装请求的函数,该函数负责在发送请求前检查token的有效性。
// utils/request.js
import uniCloud from '@dcloudio/uni-cloud';
export default async function request(method, url, data = {}, headers = {}) {
const db = uniCloud.database();
const userToken = uni.getStorageSync('userToken'); // 假设token保存在本地存储中
if (!userToken) {
throw new Error('No token found');
}
try {
// 假设有一个云函数`checkToken`用于验证token
const res = await uniCloud.callFunction({
name: 'checkToken',
data: { token: userToken }
});
if (res.result.isValid) {
// Token有效,继续发送请求
const cloudRes = await db.request({
method: method,
url: url,
data: data,
header: headers
});
return cloudRes;
} else {
// Token无效或过期,处理错误
throw new Error('Token expired or invalid');
}
} catch (error) {
// 处理请求错误,如网络错误或token验证失败
console.error('Request error:', error);
throw error;
}
}
2. 使用封装请求函数
在需要发送请求的地方,使用封装好的request
函数。
// 某个页面或组件中
import request from '@/utils/request';
export default {
methods: {
async fetchData() {
try {
const data = await request('GET', 'https://api.example.com/data');
console.log('Data fetched:', data);
} catch (error) {
// 处理错误,如token无效或无权限
console.error('Error fetching data:', error);
// 可以根据错误类型进行不同的处理,比如跳转到登录页面
if (error.message === 'No token found' || error.message === 'Token expired or invalid') {
uni.navigateTo({ url: '/pages/login/login' });
}
}
}
}
};
总结
通过封装请求函数,我们避免了在每个云对象中都添加token验证逻辑,从而提高了代码的可维护性和可读性。在实际应用中,你还可以根据具体需求进一步扩展和优化这个封装函数,比如添加请求超时处理、重试机制等。