在为用户声明架构时,我为电子邮件包含了unique: true
属性。
我还使用mongoose的mongoose.model.findOne(query, options)
方法来检查用户是否已经存在,如果出现重复的电子邮件,它会抛出预期的"用户已经存在"响应。
但是,用户无论如何都会被添加到数据库中。
下面是我的API代码:
const express = require('express');
const mongoose = require('mongoose');
const router = express.Router();
const mongoUri = require('../../config/db.json').mongoUri;
const UserModel = require('../../models/user.js');
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false,
autoIndex: false, // Don't build indexes
poolSize: 5, // Maintain up to 10 socket connections
serverSelectionTimeoutMS: 5000, // Keep trying to send operations for 5 seconds
socketTimeoutMS: 5000, // Close sockets after 45 seconds of inactivity
family: 4 // Use IPv4, skip trying IPv6
};
//@route POST api/user
//@desc Create User
//@access private
router.post('/', async (req, res) => {
const {
email,
name,
password,
permission
} = req.body;
try {
mongoose.connect(mongoUri, options);
var query = UserModel.where({
email: email
});
query.findOne((err, existingUser) => {
if (err) {
return res.status(422).send(err);
}
if (existingUser) {
return res.status(422).send({
error: 'User already exists.'
});
}
});
const user = new UserModel({
name,
email,
password,
permission
})
const newUser = await user.save();
return res.status(200).send(newUser);
} catch (error) {
return res.status(503).send(error);
}
})
module.exports = router;
我无法使用文档找出解决方案,也无法找到相关答案。
我认为这是因为你在异步代码块之外创建了newUser,所以它们都会被执行,检查并创建一个新的用户
因此创建一个新用户不会等到邮件检查完成
我建议你将创建新用户操作转移到电子邮件检查的回调中
类似的东西
var query = UserModel.where({
email: email
});
query.findOne((err, existingUser) => {
if (err) {
return res.status(422).send(err);
}
if (existingUser) {
return res.status(422).send({
error: 'User already exists.'
});
} else {
// in the else condition, the email does not exist before in db, then create the user
const user = new UserModel({
name,
email,
password,
permission
})
const newUser = await user.save();
return res.status(200).send(newUser);
}
});
希望它能帮助
let userData = req.body;
Employee.findOne({ email: req.body.email}, (error, user) =>{
if(error){
console.log(error)
}
else if(!user) {
let newEmployee = new Employee(userData);
newEmployee.save(function(err, employees) {
if(err) {
res.json({status: false, data: 'Unable to add!'});
}
res.json({status: true, data: employees});
});
}
else {
console.log("Email Already exists")
}
})
};```