MST

星途 面试题库

面试题:CouchDB设计文档验证函数中常见错误类型及处理方法

在CouchDB设计文档的验证函数里,通常会遇到哪些类型的错误,比如数据格式错误、权限不足等。针对每种错误类型,请阐述你认为合理的错误处理方式。
29.9万 热度难度
数据库CouchDB

知识考点

AI 面试

面试题答案

一键面试

1. 数据格式错误

  • 错误情况:文档数据不符合预期格式,例如日期格式不正确、字段类型不匹配等。
  • 处理方式:在验证函数中使用正则表达式、类型检查等方法进行数据格式校验。如果数据格式错误,通过throw抛出带有明确错误信息的异常,告知用户错误所在。例如:
function(doc, req) {
    if (!doc.date.match(/^\d{4}-\d{2}-\d{2}$/)) {
        throw({forbidden: "日期格式错误,应该为YYYY-MM-DD"});
    }
}

2. 权限不足

  • 错误情况:用户尝试进行超出其权限范围的操作,如非管理员用户试图修改系统关键文档。
  • 处理方式:检查请求中的用户信息(例如通过req.userCtx),判断用户权限。如果权限不足,同样通过throw抛出异常。异常信息可包含权限相关的提示,如:
function(doc, req) {
    if (!req.userCtx.roles.includes('admin') && doc.type === 'system') {
        throw({forbidden: "只有管理员有权限修改系统文档"});
    }
}

3. 文档完整性错误

  • 错误情况:文档缺少必要的字段,或者某些字段之间的逻辑关系不正确。
  • 处理方式:在验证函数中检查必填字段是否存在,以及字段间逻辑关系是否合理。若发现完整性问题,抛出异常并说明缺少或错误的部分。例如:
function(doc, req) {
    if (!doc.name ||!doc.address) {
        throw({forbidden: "文档缺少必要字段:name或address"});
    }
    if (doc.age < 0 || doc.age > 120) {
        throw({forbidden: "年龄字段值不合理"});
    }
}

4. 唯一性冲突

  • 错误情况:试图创建的文档与已有文档在某些关键字段上存在重复值,例如用户名不能重复。
  • 处理方式:使用db.view查询已有文档,检查关键字段是否重复。若存在冲突,抛出异常。比如:
function(doc, req) {
    var existing = db.view('users/by_username', {key: doc.username}).rows;
    if (existing.length > 0) {
        throw({forbidden: "用户名已存在"});
    }
}

5. 版本冲突

  • 错误情况:在更新文档时,客户端提供的版本号与数据库中的实际版本号不一致。
  • 处理方式:CouchDB 会自动处理版本冲突,在验证函数中可获取文档的当前_rev(例如通过doc._rev)与请求中的版本信息对比。如果冲突,抛出异常提示用户先获取最新版本再进行操作:
function(doc, req) {
    if (doc._rev!== req.body._rev) {
        throw({conflict: "文档版本已更新,请先获取最新版本"});
    }
}