我正在尝试使用预保存来处理用户或电子邮件存在错误,但是我无法使其正常工作。如果我注释掉了我的预保存块,那么一切都可以正常工作,但是如果重复,它将返回默认的猫鼬错误,因为我的模式使用唯一。
我想检查用户名和电子邮件的唯一性,并发送一条包含true或false的消息,以便我可以在前端同时处理这两个消息。 (顺便说一下,这是一个Express Restful API)
有人知道怎么做吗?
这是我当前的设置:
当请求通过所有中间件等时,我的注册方法在我的注册后路由上调用。ValidateRegisterForm对数据进行一些验证,如果一切正常,则哈希密码并将所有数据传递给createUser,否则它将发送错误。
public register(req, res){
validateRegisterForm(req.body).then(data => {
createUser(data).then(() => {
res.send({status: 201});
}).catch(err => {
res.send(err);
})
}).catch(err => {
res.send(err);
});
}
我的createUser方法:
export const createUser = (data) => {
return new Promise( async (resolve, reject) => {
const userData = JSON.parse(data);
const newUser = new User(userData);
await newUser.save()
.then(() => resolve())
.catch(err => reject(err))
});
};
还有带有预保存的用户模式:
userSchema.pre('save', () => {
return new Promise((resolve, reject) => {
const userExists = !! this.findOne('username');
const emailExists = !! this.findOne('email');
if (userExists || emailExists){
const err = JSON.stringify({inUse : {mail: emailExists, usr: userExists}});
reject(err)
}
resolve();
})
});
答案 0 :(得分:0)
我找到了解决方案,显然预保存不支持箭头功能。现在,一切都像魅力。对我来说,这是了解findOne的工作原理并了解与之相关的问题的原因。
我能够使用this.get('value')
相对于当前文档评估数据库 userSchema.pre('save', function (){
return new Promise(async (resolve, reject) => {
const userExists = await User.findOne({username : this.get('username')})
.then(doc => {return doc ? true : false })
.catch(err => reject(err));
const emailExists = await User.findOne({email : this.get('email')})
.then(doc => {return doc ? true : false })
.catch(err => reject(err));
if (userExists || emailExists){
const err = JSON.stringify({inUse : {mail: emailExists, usr: userExists}});
reject(err)
} else {
resolve();
}
})
});
答案 1 :(得分:0)
如果要使用预保存,则无法使用箭头(=>)函数。
您需要按照如下所示的旧式方式进行操作。
userSchema.pre('save', function () {
your code goes here....
})