# 场景需求
- 功过 schema 清洗前端来的数据结构,主要用在
create
和update
功能 - 前端给的就用(前端输入的数据校验在前端进行),前端没给的的数据根据
schema
补上:- 有
default
的用default
的数据 - 没有 default 的用数据类型的数据:
Array
: []Number
: 0- 嵌套对象: {}
String
: "" // 可能是类似 new Date()的,想办法处理- 有 枚举 的用第一个数据
- ······所有标准schema类型 (opens new window)
- 有
- 注意处理嵌套数据
_id
/_v
是 mongodb 默认有的,就算 schema 没有也不能清洗掉
# 数据实例
# 解
const dataStructor = (rowData, schema) => {
const entries = Object.entries(schema).map(([k, v]) => {
if (rowData?.[k] !== undefined) return [k, rowData[k]];
if (Array.isArray(v)) return [k, []];
if (v?.default && v.type !== "Date") return [k, v.default];
if (v?.enum) return [k, v.enum[0]];
if (!v?.type) return [k, null];
switch (v?.type) {
case "Number": return [k, 0];
case "Date": return [k, new Date()];
case "String": return [k, ""];
case "Boolean": return [k, true];
case "Buffer": return [k, Buffer.from("")];
case "Mixed": return [k, null];
default: {
if (Array.isArray(v.type)) return [k, []];
if (typeof v?.type === "object") return [k, dataStructor(null, v?.type)]
// check
return [k, null];
}
}
})
if (rowData?._id) entries.push(["_id", rowData._id]);
if (rowData?._v) entries.push(["_v", rowData._v]);
return Object.fromEntries(entries);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27