云对象URL化访问方法在uni-app中checkToken可以通过查询数据表返回TOKEN_INVALID_ANONYMOUS_USER未能获取当前用户信息当前用户为匿名身份

云对象URL化访问方法在uni-app中checkToken可以通过查询数据表返回TOKEN_INVALID_ANONYMOUS_USER未能获取当前用户信息当前用户为匿名身份

操作步骤:

前端调用代码

export const addAddressRequest = function (data: Address): Promise<ResponseData> {  
        return request.post('/addAddress', {  
            method: 'POST',  
            data  
        })  
}  
const data = {  
        id: '68648c18213929ab1d9d6c47',  
        mobile: '17777777777',  
        username: '李小明',  
        region: ['河南省', '郑州市', '金水区'],  
        address: '大学路'  
    }  
    const result = await addAddressRequest(data)

后段云对象代码

const uniID = require('uni-id-common')  
const {  
    addAddress,  
    getAddress  
} = require('./module/user')  
module.exports = {  
    _before: function() {  
        this.token = this.getHttpInfo().headers.token  
        const clientInfo = this.getClientInfo()  
        this.uniID = uniID.createInstance({ // 创建uni-id实例,其上方法同uniID  
            clientInfo  
        })  
    },  
    async addAddress() {  
        const data = JSON.parse(this.getHttpInfo().body)  
        const payload = this.uniID.checkToken(this.token)  
        const result = await uniCloud.databaseForJQL({  
            clientInfo: this.getClientInfo()  
        }).collection('yjs-address').add(data)  
        return result  
    }  
}

预期结果:

{  
    errCode: 0,  
    errMsg: '',  
    id: '新增数据的id'  
}

实际结果:

{  
    "success": false,  
    "error": {  
        "code": "FunctionBizError",  
        "message": "TOKEN_INVALID_ANONYMOUS_USER:未能获取当前用户信息:当前用户为匿名身份"  
    }  
}

bug描述:

表结构

{  
  "bsonType": "object",  
  "permission": {  
    "read": true,  
    "create": true,  
    "update": true,  
    "delete": true  
  }  
}
module.exports = {  
    _before: function() {  
        this.token = this.getHttpInfo().headers.token  
        const clientInfo = this.getClientInfo()  
        this.uniID = uniID.createInstance({  
            clientInfo  
        })  
    },  
async addAddress() {  
        const data = JSON.parse(this.getHttpInfo().body)  
        const payload = this.uniID.checkToken(this.token)  
        const result = await uniCloud.databaseForJQL({  
            clientInfo: this.getClientInfo()  
        }).collection('yjs-address').add(data)  
        return result  
}  
}

我控制台是看了payload没有问题。是有uid的。 我的云端schema和本地schema增删改查权限全都是true。 不明白为什么访问数据库的时候未能获取当前用户信息。 求大佬帮解答


更多关于云对象URL化访问方法在uni-app中checkToken可以通过查询数据表返回TOKEN_INVALID_ANONYMOUS_USER未能获取当前用户信息当前用户为匿名身份的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

jql 需要手动指定用户身份,看下文档:https://doc.dcloud.net.cn/uniCloud/jql-cloud.html#set-user

更多关于云对象URL化访问方法在uni-app中checkToken可以通过查询数据表返回TOKEN_INVALID_ANONYMOUS_USER未能获取当前用户信息当前用户为匿名身份的实战教程也可以访问 https://www.itying.com/category-93-b0.html


已解决,感谢

你是不是 url 方式没有成功传过去 token 呢?

我不明白的就是token需要特定的名字或者传输方式才能被校验到吗? 我将token传到了headers里,我在云对象中查看了headers中token是可以看到的。

回复 9***@qq.com: 你打印一下 checktoken 之前的看一下传过去了没有,一般是没有取到吧

回复 DCloud_UNI_yuhe: 可以取到。

根据你的代码分析,问题出现在token验证环节。虽然你检查了payload显示有uid,但实际数据库操作时仍报匿名用户错误,这是因为你的代码逻辑存在以下问题:

  1. checkToken未等待异步结果
const payload = this.uniID.checkToken(this.token) // 缺少await

checkToken是异步方法,需要添加await等待执行完成:

const payload = await this.uniID.checkToken(this.token)
  1. 未处理token验证失败的情况: 在调用数据库操作前,应该先验证token有效性:
async addAddress() {  
    const data = JSON.parse(this.getHttpInfo().body)  
    const payload = await this.uniID.checkToken(this.token)
    
    if (payload.code) {
        // token验证失败,直接返回错误
        return {
            errCode: payload.code,
            errMsg: payload.message
        }
    }
    
    // token验证通过,继续数据库操作
    const result = await uniCloud.databaseForJQL({  
        clientInfo: this.getClientInfo()  
    }).collection('yjs-address').add(data)  
    return result  
}
  1. 数据库权限配置: 虽然你设置了所有权限为true,但云对象URL化访问时,数据库操作会使用系统上下文而非用户上下文。建议在数据库操作时显式指定用户信息:
const result = await uniCloud.databaseForJQL({  
    clientInfo: this.getClientInfo(),
    context: {
        uid: payload.uid // 传递用户ID
    }
}).collection('yjs-address').add(data)
回到顶部