所以我有以下架构:
const VideoSchema = mongoose.Schema({
youtube: {
type: String,
index: {
unique: true,
partialFilterExpression: { youtube: { $type: 'string' } }
},
validate: {
validator: (v) => /^[a-zA-Z0-9-_]{11}$/.test(v) || v == null,
message: "Youtube ID doesn't match pattern"
}
}
})
这很好。我可以有唯一的空值和字符串值。
然后我实现了库: mongoose-unique-validator
之所以实现这一点,是因为我需要为唯一值自定义错误,而mongodb的错误是不可读的。
VideoSchema.plugin(uniqueValidator, {
message: ({ path, value }) => {
if (path == 'youtube') return 'Youtube ID already exists.'
}
})
VideoSchema.post('save', async function (err, doc, next) {
const error = [];
if (err.name == 'ValidationError') {
for (const a in err.errors) error.push(err.errors[a].message)
return next(error)
}
else return next(err)
})
但是在此之后,空值不再被视为partialIndex,而是报告“ Youtube ID已经存在。” ,并且它正在检查的值为空。
如何跳过空值或以其他方式实现自定义消息?