希望官方引起重视,uni-app数据无法正常存储,云数据库无法往数组类型中存储字符串数据类型的记录

希望官方引起重视,uni-app数据无法正常存储,云数据库无法往数组类型中存储字符串数据类型的记录

操作步骤:

// 文档教程: https://uniapp.dcloud.net.cn/uniCloud/schema
{
"bsonType": "object",
"required": ["realName","id_zheng","id_fan","bankCard","phoneNumber"],
"permission": {
"read": true,
"create": true,
"update": "doc.user_id==auth.uid",
"delete": false
},
"properties": {
"_id": {
"description": "ID,系统自动生成"
},
"user_id":{
"description": "用户id",
"bsonType": "string",
"foreignKey": "uni-id-users._id",
"defaultValue":{ "$env": "uid"}
},
"realName":{
"title":"真实姓名",
"description": "请输入真实姓名",
"bsonType": "string",
"trim": "both"
},
"id_zheng":{
"title":"身份证正面",
"bsonType": "object"
},
"id_fan":{
"title":"身份证反面",
"bsonType": "object"
},
"bankCard":{
"title": "银行卡号",
"bsonType": "string",
"minLength": 19,
"maxLength": 19
},
"phoneNumber":{
"title": "电话号码",
"bsonType": "string",
"pattern":  "^\\+?[0-9-]{3,20}$",
"errorMessage":{
"pattern":"电话号码格式错误"
}
},
"status":{
"description": "用户身份验证的状态,0为没有验证,1是已经提交但是还没通过,2是管理员已经通过",
"bsonType": "int",
"defaultValue":0,
"enum":[
{
"text":"已经审核,但是审核未通过",
"value":-1
},
{
"text":"没有验证",
"value":0
},
{
"text":"已经提交,还未通过",
"value":1
},
{
"text":"管理员已经通过身份审核",
"value":2
}
]
},
"subTime":{
"description": "用户提交身份验证的时间",
"bsonType": "string"
},
"updateRecord":{
"description": "用户对自己的信息进行修改添加的操作记录,例如:x年X月X日用户添加了身份信息,X年X月X日用户修改了信息,X年X月X日用户通过了审核之类的记录",
"bsonType": "array",
"arrayType":"string"
}
}
}

下面是用户提交点击按钮时执行的方法
const idCard = uniCloud.importObject("idCard");
前端触发按钮时执行的方法:
//经过上面,表单已经检验成功,可以提交入库,该方法为表单提交的方法
async formSubmit(){
let user_id= this.hasLogin().user_id;
//用户走到这里说明数据已经按照要求通过校验,并符合相关正则校验
//如果是新用户之前没有提交过个人信息,就将信息添加到数据库中
if(!this.isVer){
await idCard.addIdCard({
user_id,
realName:this.formObj.realname,
id_zheng:this.success_zheng_url,
id_fan:this.success_fan_url,
bankCard:this.formObj.bankCard,
phoneNumber:this.formObj.phoneNumber,
status:1,
//将时间戳转换为x年x日x分:x秒的格式
subTime:utils.getOrderTime(Date.now())
})
this.showToast("添加成功")
}else{
//走到这里,说明用户提交过个人信息,则用户可能希望的是修改个人信息,先提示用户
uni.showModal({
title:"确认对身份验证信息进行修改吗?",
success:async res => {
console.log(this.formObj);
//用户点击确认
if(res.confirm){
//说明是数据修改
await idCard.updateIdCard({
user_id,
realName:this.formObj.realname,
id_zheng:this.success_zheng_url,
id_fan:this.success_fan_url,
bankCard:this.formObj.bankCard,
phoneNumber:this.formObj.phoneNumber,
status:1,
subTime:utils.getOrderTime(Date.now())
})
}
}
})
}

//将数据提交给后端云对象进行入库,云对象名:idCard,后端代码为:  
const db = uniCloud.database();
const dbCmd = db.command;  
//新用户执行添加入库的操作  
async addIdCard(param){
let {user_id,realName,id_zheng,id_fan,bankCard,phoneNumber,status,subTime} = param;
let newRecord = `${subTime}用户新增了身份验证`;
//console.log(newRecord);
let result =  await db.collection("school_idcard").add({
user_id,
realName,
id_zheng,
id_fan,
bankCard,
phoneNumber,
status,
subTime,
updateRecord:dbCmd.unshift([newRecord]),
})    
return result;
},
//老用户执行修改个人数据,然后入库的操作
//用户已经通过验证,但是用户现在想修改当前的验证信息
async updateIdCard(param){
let {_id,user_id,realName,id_zheng,id_fan,bankCard,phoneNumber,subTime,status} = param;
let newRecord = `${subTime}用户修改了身份验证信息`;
let result =  await db.collection("school_idcard").where({
_id,
user_id,
}).update({
realName,
id_zheng,
id_fan,
bankCard,
phoneNumber,
status,
subTime,
updateRecord:dbCmd.unshift([newRecord])
})
return result;
}

预期结果:

"updateRecord":[
"2023-11-01 11:03:15用户修改了身份验证"
"2023-11-01 10:29:28用户新增了身份验证",
]

实际结果:

"updateRecord": {
"operator": "unshift",
"operands": [
"2023-11-01 10:29:28用户新增了身份验证"
],
"fieldName": {}
}

bug描述:

云数据库中使用DBschema编写数据存储的格式,类型,以及权限后,往数组中存储对象可以正常存储,但是往数组中存储字符串记录时,无法存储字符串进入数组中,业务场景:用户向我平台提交身份验证时,用户向我平台提交用户名,身份证件的正反面,银行卡号等敏感信息进行添加入库,以及对上述字段信息进行修改入库时,系统需要添加记录添加或者修改的记录,如:某年某月某日某时某分某秒某某用户添加了身份验证信息,以及某年某月某日某时某分某秒某某用户修改了身份验证信息,这个记录通常为字符串类型,我以updateRecord字段以数组的形式来记录上述用户添加或者修改的状态信息,并保持后续的持续记录,但是往该数组中添加相关记录时,系统会强行将字符串类型记录强行转型成对象类型入库,并记录入库的操作方法,这是我司业务不希望看到的,在强转之后,在用户进行修改记录时,由于系统设置updateRecord字段为数组,系统强转成对象后,再次修改的数据无法正常入库,并且系统会报错,报错的大概意思是:updateRecord字段定义为数组,而我却修改了其中的对象,导致数据存储失败,下面是我的代码 数据库代码:


更多关于希望官方引起重视,uni-app数据无法正常存储,云数据库无法往数组类型中存储字符串数据类型的记录的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

add里面是不支持更新操作符的,另外jql语法是不支持使用更新操作符的

更多关于希望官方引起重视,uni-app数据无法正常存储,云数据库无法往数组类型中存储字符串数据类型的记录的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在下午对您的提示以后,对代码进行了更新,发现在往数组中存储元素时,系统会强制将数组类型进行强转为字符串,在用户进行修改操作时,数据仍然报错,无法入库,我将问题已发至文档:https://ask.dcloud.net.cn/question/180674,希望官方看看是怎么回事

关于你在 uni-app 中使用云数据库时遇到的数组类型无法正常存储字符串数据的问题,以下是一些可能的原因和解决方案,供你参考:


1. 检查数据结构

确保你向数组字段中存储的数据格式是正确的。例如,如果你尝试向一个数组字段中添加字符串,确保该字段在云数据库中定义为数组类型,并且你传递的数据是一个字符串。

示例:

// 假设字段名为 "tags",类型为数组
db.collection('your_collection').doc('your_doc_id').update({
  tags: _.push('new_tag') // 使用云函数提供的 push 方法
})

2. 使用云函数操作数组

如果你直接在前端操作数组字段,可能会遇到权限或数据格式问题。建议使用云函数来操作数组字段,确保数据格式和权限正确。

云函数示例:

exports.main = async (event, context) => {
  const db = cloud.database();
  const _ = db.command;
  return await db.collection('your_collection').doc('your_doc_id').update({
    tags: _.push(event.newTag) // 将新标签推入数组
  });
};

3. 检查数据库权限

确保你的数据库权限设置允许你更新数组字段。如果权限不足,可能会导致数据无法正常存储。

  • 在 uniCloud 控制台中,检查集合的权限设置。
  • 确保更新操作(update)的权限是开放的。

4. 调试和日志

在开发过程中,可以通过以下方式调试问题:

  • 使用 console.log 打印数据,确保你传递的数据格式正确。
  • 在 uniCloud 控制台中查看云函数的日志,检查是否有错误信息。

5. 更新 uni-app 和 uniCloud SDK

确保你使用的 uni-app 和 uniCloud SDK 是最新版本。旧版本可能存在一些已知问题,更新到最新版本可能会解决你的问题。


6. 联系官方支持

如果以上方法都无法解决问题,建议通过以下方式联系官方支持:

  • DCloud 社区 发帖,详细描述你的问题。
  • 提交工单或联系 uni-app 官方客服,提供具体的错误信息和代码示例。

示例代码

以下是一个完整的示例,展示如何向数组字段中添加字符串数据:

// 前端代码
uniCloud.callFunction({
  name: 'updateArrayField',
  data: {
    collection: 'your_collection',
    docId: 'your_doc_id',
    newTag: 'new_tag'
  }
});

// 云函数代码
exports.main = async (event, context) => {
  const db = cloud.database();
  const _ = db.command;
  return await db.collection(event.collection).doc(event.docId).update({
    tags: _.push(event.newTag)
  });
};
回到顶部