uni-app clientDB(nosql) 新增数据时非required字段也要求填写
uni-app clientDB(nosql) 新增数据时非required字段也要求填写
操作步骤:
{
"bsonType": "object",
"required": ["client_id"],
"permission": {
"read": "auth.uid==doc._id",
"create": true,
"update": "auth.uid==doc._id",
"delete": false
},
"properties": {
"_id": {
"description": "微信Open ID",
"bsonType": "string",
"trim": "both",
"maxLength": 128,
"foreignKey": "account._openid",
"forceDefaultValue": { "$env": "uid" }
},
"client_id": {
"description": "推送ID",
"bsonType": "string",
"trim": "both",
"maxLength": 128
},
"last_login": {
"bsonType": "date",
"description": "最后登陆时间"
}
}
}
客户端代码
uniCloud.database().collection('xxx').add({ _id: openId, client_id: cid })
预期结果:
新增数据成功
实际结果:
["last_login"] 类型不匹配
bug描述:
我的schema中写了一个date类型的last_login(非required),当我在clientDB调用add方法时,如果我不指定last_login则会返回“last_login 类型不匹配”。必须要手动在add的参数中增加last_login字段才行。
此外还有另一个bug,如果我写了forcedDefaultValue: {"$env": “now”}的话,我不填写last_login会报上面的错误,我填写了的话会告诉我和默认值不匹配……按照文档的说明应该是会覆盖上传的值,我不太理解为什么会进行比对并报错……
在 uni-app
中使用 clientDB(NoSQL 数据库)时,如果需要确保在新增数据时非必填字段也被填写,可以通过在应用层增加校验逻辑来实现。虽然数据库本身不强制要求非必填字段必须有值,但你可以在保存数据之前对数据进行校验。
以下是一个示例代码,展示如何在 uni-app
中实现这一逻辑。假设你有一个 User
集合,其中 name
是必填字段,而 age
和 email
是非必填字段,但你希望在新增用户时这两个字段也被填写。
1. 校验函数
首先,定义一个校验函数来检查数据是否完整。
function validateUser(user) {
const errors = [];
if (!user.name) {
errors.push('Name is required.');
}
if (!user.age) {
errors.push('Age is required.');
}
if (!user.email) {
errors.push('Email is required.');
}
if (errors.length > 0) {
throw new Error(errors.join('\n'));
}
return true;
}
2. 新增用户函数
然后,定义一个函数来新增用户,并在保存前调用校验函数。
async function addUser(user) {
try {
// 校验数据
validateUser(user);
// 假设你使用的是 uniCloud DB
const db = uniCloud.database();
const collection = db.collection('User');
// 新增数据
await collection.add({
data: user
});
uni.showToast({
title: 'User added successfully',
icon: 'success'
});
} catch (error) {
console.error('Error adding user:', error.message);
uni.showToast({
title: 'Failed to add user',
icon: 'none'
});
}
}
3. 调用新增用户函数
最后,在你的页面或组件中调用这个函数。
// 示例用户数据
const newUser = {
name: 'John Doe',
age: 30,
email: 'john.doe@example.com'
};
// 新增用户
addUser(newUser);
通过这种方式,你可以确保在新增用户时,即使 age
和 email
字段在数据库中不是必填的,也会在应用层进行校验,确保这些字段被填写。这种方法不仅适用于 uni-app
的 clientDB,也适用于其他类似的场景,只需要根据具体的数据库和框架做相应的调整即可。