如何在注册控制器中添加条件以检查电子邮件是否已经存在



当用户尝试注册并输入详细信息时,会调用此API。我想看看我是否可以添加一个条件,说明电子邮件已经存在。

我想我需要这样的东西:

const user = await User.find({ email })
if (user) {
res.status(400).json({ message: "User with this already exists" })
}

但是我正在创建一个新用户,所以我应该把上面的查询放在哪里。我对处决的顺序有点困惑。

module.exports = {
registerUser: async(req, res, next) => {
try {
var {
username,
email,
password
} = req.body
if (password) {
const salt = bcrypt.genSaltSync(10)
password = bcrypt.hashSync(password, salt)
}
if (!username || !email || !password) {
return res
.status(400)
.json({
message: "Username, email and password are must"
})
}
if (!validator.isEmail(email)) {
return res.status(400).json({
message: "Invaid email"
})
}
if (password.length < 6) {
return res
.status(400)
.json({
message: "Password should be of at least 6 characters"
})
}
const user = await User.create({
username,
email,
password
})
if (!user) {
return res.status(404).json({
error: "No user found "
})
}
return res.status(200).json({
user
})
} catch (error) {
return next(error)
}
}

我认为最好的解决方案是将它放在任何逻辑之前,而且我将if块中的res.json更改为throw,因为throw停止执行下面的代码,但res.json继续执行,这可能会导致潜在的问题。此外,我将Module.find()更改为Module.findOne(),因为如果未找到任何内容,find()将返回空数组,而if([emptyArray](将返回true

module.exports = {
registerUser: async(req, res, next) => {
try {
var {
username,
email,
password
} = req.body
const user = await User.findOne({
email
})
if (user) {
throw 'User with this already exists'
}
if (password) {
const salt = bcrypt.genSaltSync(10)
password = bcrypt.hashSync(password, salt)
}
if (!username || !email || !password) {
return res
.status(400)
.json({
message: "Username, email and password are must"
})
}
if (!validator.isEmail(email)) {
return res.status(400).json({
message: "Invaid email"
})
}
if (password.length < 6) {
return res
.status(400)
.json({
message: "Password should be of at least 6 characters"
})
}
const user = await User.create({
username,
email,
password
})
if (!user) {
return res.status(404).json({
error: "No user found "
})
}
return res.status(200).json({
user
})
} catch (error) {
return next(error)
}
}

将其放在注册逻辑之前的try块中,因为如果电子邮件不存在,find可能会抛出并出错。

最新更新