为什么我的Node.js api从MongoDb中识别出一个重复的用户,但仍然添加了一个额外的用户



在为用户声明架构时,我为电子邮件包含了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")
}

})
};```

最新更新