Node.js 我一直在尝试用Mongoose解决nodeJS中的重复密钥问题,但没有任何效果
我正在尝试建立一个用户模型,但我想确保用户名和电子邮件是唯一的。当我创建第一个用户时,一切都正常,但是当我尝试创建具有相同信息的第二个用户时,我得到了一些错误,我可以在保存时处理这些错误,但是没有复制密钥来处理它Node.js 我一直在尝试用Mongoose解决nodeJS中的重复密钥问题,但没有任何效果,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在尝试建立一个用户模型,但我想确保用户名和电子邮件是唯一的。当我创建第一个用户时,一切都正常,但是当我尝试创建具有相同信息的第二个用户时,我得到了一些错误,我可以在保存时处理这些错误,但是没有复制密钥来处理它 这是我的架构文件代码: const UserSchema = new Schema({ // this username with SchemaType of string username: { type: String, lowerc
const UserSchema = new Schema({
// this username with SchemaType of string
username: {
type: String,
lowercase: true,
required: [true, "username is required"],
unique: true,
trim: true,
minlength: [4, "try to user longer name"],
maxlength: [60, "your name is way too long"],
},
// virtual name
name: {
// name have two properties
// first is first and refer to first-name
// second is last and refer to last-name
first: {
type: String,
lowercase: true,
trim: true,
minlength: 4,
maxlength: 20
},
last: {
type: String,
lowercase: true,
trim: true,
minlength: 4,
maxlength: 20
}
},
password: {
type: String,
required: [true, "password is required"]
},
email: {
type: String,
required: [true, "email is required"],
unique: true
},
active: {
type: Boolean,
default: true
},
admin: {
type: Boolean,
default: false
},
meta: {
update: {
type: Date,
default: Date.now()
},
timestamp: {
type: Date,
default: Date.now()
}
}
});
UserSchema.virtual("fullname").get(function () {
// return the concatenation of first and last
return this.name.first + " " + this.name.last;
});
// Create User Model
const User = mongoose.model("User", UserSchema);
module.exports = User;
router.post("/register", (request, response) => {
const user = {
username: request.body.username,
email: request.body.email,
password: request.body.password
};
if (!user.email && !user.username && !user.password) {
return response.json({
"message": "please fill the whole information"
});
}
// put user info in model
const newUser = new User({
username: user.username,
email: user.email,
password: user.password
})
newUser.validate((err) => {
console.log(err);
});
// save User in model
newUser.save()
// return response with info
return response.status(201).json(user);
})
我认为这里的解释很简单。您正在为多个字段指定模式中的
unique
属性,因此mongo将不允许您使用相同的信息创建多个条目。这是很明显的
另外,我注意到你的代码有点不规则。您正在调用的save方法返回一个承诺
,这意味着事件循环不会阻止您的代码,并且会立即返回响应。为此,您需要在然后
块中处理响应,或者在整个代码中使用异步等待
我建议作出以下修改:
router.post("/register", (request, response) => {
const user = {
username: request.body.username,
email: request.body.email,
password: request.body.password
};
if (!user.email && !user.username && !user.password) {
return response.json({
"message": "please fill the whole information"
});
}
// put user info in model
const newUser = new User({
username: user.username,
email: user.email,
password: user.password
})
newUser.validate((err) => {
if(err) {
response.status(403).json({ message: 'Your custom error message' });
}
newUser.save().then(res => {
return response.status(201).json(user);
}).catch(e => {
return response.status(500).json({ message: 'Your custom error message' });
})
});
})
谢谢你的回答。这对我帮助很大,我错过了拯救的承诺,无论如何,谢谢你的努力