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"

Image


更多关于uni-app中checkToken()返回的对象在服务器端无法获取属性值?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

补充问题:从数据表uni-id-users删除用户记录后,checkToken()验证用户token仍然有效,如何解决?

更多关于uni-app中checkToken()返回的对象在服务器端无法获取属性值?的实战教程也可以访问 https://www.itying.com/category-93-b0.html


目前没有配置项,要实现这个只能去改uni-id源码

回复 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);
回到顶部