uni-app clientDB(nosql) 新增数据时非required字段也要求填写

发布于 1周前 作者 h691938207 来自 Uni-App

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会报上面的错误,我填写了的话会告诉我和默认值不匹配……按照文档的说明应该是会覆盖上传的值,我不太理解为什么会进行比对并报错……


1 回复

uni-app 中使用 clientDB(NoSQL 数据库)时,如果需要确保在新增数据时非必填字段也被填写,可以通过在应用层增加校验逻辑来实现。虽然数据库本身不强制要求非必填字段必须有值,但你可以在保存数据之前对数据进行校验。

以下是一个示例代码,展示如何在 uni-app 中实现这一逻辑。假设你有一个 User 集合,其中 name 是必填字段,而 ageemail 是非必填字段,但你希望在新增用户时这两个字段也被填写。

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);

通过这种方式,你可以确保在新增用户时,即使 ageemail 字段在数据库中不是必填的,也会在应用层进行校验,确保这些字段被填写。这种方法不仅适用于 uni-app 的 clientDB,也适用于其他类似的场景,只需要根据具体的数据库和框架做相应的调整即可。

回到顶部