gpt4 book ai didi

javascript - 尽管在 Mongoose 中将电子邮件设置为唯一,但仍能够使用同一电子邮件创建多个用户

转载 作者:行者123 更新时间:2023-12-03 03:15:20 25 4
gpt4 key购买 nike

我正在使用 Express、MongoDB 和 Mongoose 编写 API。我能够以某种方式使用同一电子邮件创建多个用户。但是,我不应该能够使用相同的电子邮件地址创建另一个用户。我的用户架构中有电子邮件 unique: true,但这并未按预期工作。

这是我的用户架构:

var UserSchema = new Schema({
fullName: { type: String, required: [true, 'Full name is required.'] },
emailAddress: {
type: String, required: true, unique: true,
validate: {
validator: function (value) {
// check for correct email format
return /^[a-zA-Z0-9.!#$%&’*+\/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(value)
},
message: `Please enter a valid email address!`
}
},
password: { type: String, required: true }
});

我的用户验证方法:

UserSchema.statics.authenticate = function (email, password, callback) {
User.findOne({ emailAddress: email })
.exec(function (err, user) {
if (err) {
return callback(err);
} else if (!user) {
var error = new Error('User not found');
error.status = 401;
return callback(error);
}
bcrypt.compare(password, user.password, function (error, user) {
if (user) {
return callback(null, user);
} else {
return callback();
}
});
});
}

我的预保存钩子(Hook)用于散列密码:

UserSchema.pre('save', function (next) {
var user = this;
bcrypt.hash(user.password, 10, function (err, hash) {
if (err) {
return next(err);
}
user.password = hash;
next();
});
});

最后,我的用户创建路线:

router.post('/', function (req, res, next) {
if (req.body.fullName &&
req.body.emailAddress &&
req.body.password &&
req.body.confirmPassword) {

if (req.body.password != req.body.confirmPassword) {
var err = new Error('Passwords do not match!');
err.status = 400;
return next(err);
}

// object with form input
var userData = {
fullName: req.body.fullName,
emailAddress: req.body.emailAddress,
password: req.body.password
};

// schema's 'create' method to insert document into Mongo
User.create(userData, function (error, user) {
if (error) {
var err = new Error('Please enter a valid email.');
err.status = 400;
return next(err);
} else {
// set location header to '/', return no content
res.status(201);
res.location('/');
req.session.userId = user._id;
return res.json(user);
}
});

} else {
var err = new Error('All fields required.');
err.status = 400;
return next(err);
}
});

最佳答案

如果字段值已存储重复项,MongoDB 不会为该字段创建唯一索引。

在您的情况下,emailAddress 必须已在数据库中存储重复项。您可以通过运行代码来检查

Mongoose
.model(#模型名称)
.collection.createIndex( { "inviteCode": 1 });

运行此代码后,您应该能够在控制台中看到一条错误消息。

或者您可以通过运行以下代码来检查是否有重复。如果有重复,下面将获取文档:

Mongoose
.model(#modelName).aggregate([{
“$组”:{
"_id": "$loginStatus",
计数: { $sum: 1 },
id: { $push: "$_id"}
}
},{ $匹配: {
计数:{$gt:1}
}}])
;

如果您的电子邮件地址已经重复,则无法在其上创建 unique: true 。您必须运行第二个查询并找出重复的电子邮件地址。您可以在 ids 数组中找到包含重复电子邮件的文档。

关于javascript - 尽管在 Mongoose 中将电子邮件设置为唯一,但仍能够使用同一电子邮件创建多个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46797581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com