javascript - 如何在保存用户之前检查电子邮件是否存在
问题描述
我正在启动 nodeJS / MongoDB,并且正在尝试创建一个简单的身份验证 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) {
。因此,可以使用现有电子邮件保存用户。
如何在保存用户之前正确检查电子邮件是否存在?
谢谢
解决方案
问题在Object.keys(allFields).forEach(async field
。foreach 里面的代码是async
函数,所以它中间执行,下一行代码不等它结束。您应该进行 signUp async
:export async function signUp
并替换forEach
为常规循环:
for (const field in allFields) {
...
}
推荐阅读
- python - 如何将 Numpy ndarray 分成块
- r - 使用 R 根据指定条件将日期转换为日期范围
- ios - 没有 Interface Builder 的自定义 UITabBar 子类
- c - 如果 MPI Isend/Irecv 和 MPI wait 之间的语句阻止程序继续进行。这可能是什么原因造成的?
- html - 一个视频我不会在 chrome 中加载加载。我该如何解决?
- java - minOccurs 和 maxOccurs
- android - Android Volley - 异步测试
- sql-server - SQL Server Management Studio 使用 While 循环函数来拆分结果
- javascript - 错误:无法匹配任何路由。URL 段:“?”
- python - 使用 Python 请求模块登录 Robinhood