![](/img/trans.png)
[英]Trying to check if a user exist in my mongodb before inserting a new user (To prevent multiple same-email registration)
[英]How to check if email exist before save the user
我正在启动nodeJS / MongoDB,并且试图创建一个简单的auth API。 我从SignIn函数开始,但是在检查表单值时,我在使用异步函数时遇到了一些困难。 在数据库中保存一行之前,我尝试检查每个值。 因此,我检查密码和电子邮件格式,当我想检查电子邮件是否已经存在时,我的麻烦就开始了。
在这里,您可以看到我提交表单时调用的函数:
export function signUp(req, res) {
const { email, password, confirmPassword } = req.body || '';
const allFields = { email, password, confirmPassword };
let errors = {};
Object.keys(allFields).forEach(async field => {
const value = allFields[field];
if (value === '') {
errors = {...errors, [field]: 'Ce champ est requis'}
} else {
if (field === 'email') {
if (!checkEmailFormat(value)) {
errors = {...errors, [field]: 'Le format de mail n\'est pas valide'}
} else {
const { error, exist } = await checkEmailExist(value);
if (exist) {
console.log(exist);
console.log(error);
errors = {...errors, ...error};
}
}
}
if (field === 'password' && password !== '' && password < 6) {
errors = {...errors, [field]: 'Le mot de passe doit contenir plus de 6 caractères'}
}
}
});
console.log(errors);
console.log(Object.keys(errors).length);
console.log('--------------------');
// Retour des erreurs vers le FRONT ou Save de l'user
if (Object.keys(errors).length > 0) {
console.log(errors);
res.json({ errors });
} else {
...Save my row in db
}
}
这是我的功能checkEmailExist
谁签入数据库
const checkEmailExist = async (value) => {
const { error, exist } = await User.findOne({'email': value}).exec()
.then(user => {
let res = {};
if (user) {
res = { error: { 'email': "Cet adresse email n'est pas disponible" }, exist: true };
} else {
res = { error: { 'email': "" }, exist: false };
}
return res;
})
.catch(err => console.log(err))
return { error, exist };
}
我的目标是获取来自checkEmailExist
函数返回的错误,并将此错误与其他错误一起发送至FRONT。 但是findOne
是一个异步函数, if (Object.keys(errors).length > 0) {
当我检查错误数组时,查询始终处于待处理状态。 因此,用户可以与现有电子邮件一起保存。
保存用户之前,如何正确检查电子邮件是否存在?
谢谢
解决方案一:当用户使用onchange在文本字段中键入电子邮件或离开电子邮件字段时,请使用checkEmailExist。
解决方案二:使用ES6 ASYNC / AWAIT保持流,直到从checkEmailExist方法返回true或false。
删除。然后查询...如果您正在使用等待,那么为什么需要...
const checkEmailExist = async (value) => {
const { error, exist } = await User.findOne({'email': value}).exec()
return { error, exist };
}
看起来您正在将.then与等待混合。 我承认这里不是异步/等待方面的专家,尤其是当与promises混合使用时,但您的checkEmailExist函数可能如下所示:
const checkEmailExist = async (value) => {
const user = await User.findOne({'email': value}).exec()
.catch(err => console.log(err))
let res = {};
if (user) {
res = { error: { 'email': "Cet adresse email n'est pas disponible" }, exist: true };
} else {
res = { error: { 'email': "" }, exist: false };
}
return res;
}
?
不确定是否会有所不同,但将await和then混合使用可能会给您带来意想不到的结果
问题在Object.keys(allFields).forEach(async field
内部的代码是async
函数,因此它处于中间执行状态,下一行代码不等待其结束,您应该使signUp async
: export async function signUp
并用常规循环替换forEach
:
for (const field in allFields) {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.