云对象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 回复
已解决,感谢
你是不是 url 方式没有成功传过去 token 呢?
我不明白的就是token需要特定的名字或者传输方式才能被校验到吗? 我将token传到了headers里,我在云对象中查看了headers中token是可以看到的。
回复 9***@qq.com: 你打印一下 checktoken 之前的看一下传过去了没有,一般是没有取到吧
回复 DCloud_UNI_yuhe: 可以取到。
根据你的代码分析,问题出现在token验证环节。虽然你检查了payload显示有uid,但实际数据库操作时仍报匿名用户错误,这是因为你的代码逻辑存在以下问题:
- checkToken未等待异步结果:
const payload = this.uniID.checkToken(this.token) // 缺少await
checkToken是异步方法,需要添加await等待执行完成:
const payload = await this.uniID.checkToken(this.token)
- 未处理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
}
- 数据库权限配置: 虽然你设置了所有权限为true,但云对象URL化访问时,数据库操作会使用系统上下文而非用户上下文。建议在数据库操作时显式指定用户信息:
const result = await uniCloud.databaseForJQL({
clientInfo: this.getClientInfo(),
context: {
uid: payload.uid // 传递用户ID
}
}).collection('yjs-address').add(data)


