我有像这样的用户架构
const UserSchema = new Schema({
username: {
type: String,
unique: true,
required: true,
lowercase: true,
trim: true
},
email: {
type: String,
unique: true,
required: true
},
phoneNumber: {
type: Number,
unique: true,
required: true
},
});
当我发布重复name
,phonenumber
或email
的用户时。我收到这样的错误:
这是错误消息E11000 duplicate key error collection: project.users index: username_1 dup key: { : "john" }
所以我的问题是,我怎么知道它是一个重复的名称或重复的phonenumber。我希望收到这样的错误。
This phone number has been already used
This name has been already used
答案 0 :(得分:0)
或者,您可以使用path
validation mechanism。
UserSchema.path('username').validate(function(value, done) {
this.model('User').count({ username: value }, function(err, count) {
if (err) {
return done(err);
}
done(!count);
});
}, 'User Name already exists');
UserSchema.path('email').validate(function(value, done) {
this.model('User').count({ email: value }, function(err, count) {
if (err) {
return done(err);
}
done(!count);
});
}, 'Email already exists');
UserSchema.path('phoneNumber').validate(function(value, done) {
this.model('User').count({ phoneNumber: value }, function(err, count) {
if (err) {
return done(err);
}
done(!count);
});
}, 'Phone already exists');
答案 1 :(得分:0)
您可以在错误处理程序中捕获错误。您可以使用正则表达式获取路径名称和值。简单的例子:
app.use((err, req, res, next) => {
if (err.code === 11000 || err.code === 11001) {
const pathRegex = err.message.match(/\.\$([a-z]+)/)
const path = pathRegex ? pathRegex[1] : '';
const keyRegex = err.message.match(/key:\s+{\s+:\s\"(.*)(?=\")/)
const key = keyRegex ? keyRegex[1] : '';
return res.status(409)
.json({ status: false, message: `${path} '${key}' already exists`})
}
}
您还可以查看产生猫鼬“验证错误”的mongoose-unique-validator。你可以更轻松地解析。