uni-app中checkToken()返回的对象在服务器端无法获取属性值?
uni-app中checkToken()返回的对象在服务器端无法获取属性值?
产品分类:
uniCloud/App
示例代码:
const uniID = require('uni-id-common')
// const db = uniCloud.database()
async function myCheckToken(clientInfo,token){
// 创建uni-id实例,其上方法同uniID
const tokenRes = await uniID.createInstance({
clientInfo
}).checkToken(token)
return tokenRes
}
module.exports = {
_before: function () { // 通用预处理器
const httpInfo = this.getHttpInfo()
const clientInfo = this.getClientInfo()
const {token,body} = httpInfo.headers
if(body){
this.params = JSON.parse(body)
}
// let uid
if(token) {
// 创建uni-id实例,其上方法同uniID
this.tokenRes = myCheckToken(clientInfo,token)
// if(this.tokenRes.errCode === 0) {
// this.uid = this.tokenRes.uid
// // this.tokenRes = tokenRes
// }else{
// throw{
// // errCode: tokenRes.errCode,
// errCode: 4004,
// errMsg: 'token无效,请先登录'
// }
// }
}else{
throw{
errCode: 404,
errMsg: '请先登录'
}
}
},
test: function() {
const uid = this.tokenRes.uid //这里取的uid值为空
return this.tokenRes
},
_after(error, result) {
if(error) {
return error
}
return result
}
}
操作步骤:
如上代码
预期结果:
如上描述
实际结果:
如上描述
bug描述:
用点号取this.tokenRes
对象里的属性均为空值,如下取值方式:
this.tokenRes.uid
this.tokenRes.errCode
但却可以把对象this.tokenRes
整体返回给客户端,客户端接手到的结果如下:
data:
code: 0
errCode: 0
exp: 1711028570
iat: 1703252570
permission: []
role: []
uid: "65855260fe975f47a5d321df"
proto: Object
errMsg: "request:ok"
更多关于uni-app中checkToken()返回的对象在服务器端无法获取属性值?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
6 回复
回复 DCloud_uniCloud_WYQ: 多谢答复
你的myCheckToken是个async函数,调用的时候没有await
多谢答复
在 uni-app
中,checkToken()
通常用于验证用户的登录状态或令牌的有效性。如果你在服务器端无法获取 checkToken()
返回的对象的属性值,可能是由于以下几个原因:
1. 对象属性未正确序列化
- 原因: 当你在客户端调用
checkToken()
并返回一个对象时,如果该对象没有正确序列化(例如,它是一个class
实例),在通过网络传输到服务器时,可能会丢失一些属性或方法。 - 解决方案: 确保返回的对象是一个纯 JavaScript 对象(Plain Object),并且所有需要传输的属性都是可序列化的。你可以使用
JSON.stringify()
将对象转换为字符串,然后在服务器端使用JSON.parse()
解析。
// 客户端
const tokenInfo = checkToken();
const serializedTokenInfo = JSON.stringify(tokenInfo);
// 服务器端
const tokenInfo = JSON.parse(serializedTokenInfo);
2. 异步问题
- 原因: 如果
checkToken()
是一个异步函数,你可能没有等待它返回结果就开始处理数据,导致服务器端获取到的对象不完整或为空。 - 解决方案: 确保你在调用
checkToken()
时使用await
或.then()
等待异步操作完成。
// 客户端
async function getTokenInfo() {
const tokenInfo = await checkToken();
return tokenInfo;
}
// 服务器端
app.get('/some-endpoint', async (req, res) => {
const tokenInfo = await getTokenInfo();
res.json(tokenInfo);
});
3. 跨域问题
- 原因: 如果你的客户端和服务器端不在同一个域名下,可能会遇到跨域问题,导致请求被阻止或数据无法正确传输。
- 解决方案: 确保服务器端设置了正确的
CORS
头,允许客户端请求跨域资源。
// 服务器端
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
4. 请求头问题
- 原因: 如果
checkToken()
返回的对象是通过请求头传递的,可能请求头没有正确设置或服务器端没有正确解析。 - 解决方案: 确保请求头正确设置,并且在服务器端正确解析。
// 客户端
const tokenInfo = checkToken();
const headers = {
'Authorization': `Bearer ${tokenInfo.token}`,
'Content-Type': 'application/json'
};
// 服务器端
app.get('/some-endpoint', (req, res) => {
const token = req.headers['authorization'].split(' ')[1];
// 处理 token
});
5. 服务器端代码问题
- 原因: 服务器端代码可能没有正确处理接收到的数据,导致无法获取属性值。
- 解决方案: 检查服务器端代码,确保正确解析和处理从客户端发送的数据。
// 服务器端
app.post('/some-endpoint', (req, res) => {
const tokenInfo = req.body;
console.log(tokenInfo.someProperty); // 确保属性存在
});
6. 调试和日志
- 原因: 如果以上方法都无法解决问题,可能是由于某些隐藏的错误或逻辑问题。
- 解决方案: 在客户端和服务器端添加调试日志,检查数据在传输过程中是否发生了变化或丢失。
// 客户端
console.log('Token Info:', tokenInfo);
// 服务器端
console.log('Received Token Info:', req.body);