Mongoose Unique字段错误信息处理
Mongoose Unique field error message handling
我对 Mongoose 中的唯一字段有疑问
当我尝试使用现有电子邮件或用户名创建新用户时它起作用了。
现在它总是发送错误 500。
但是有没有办法有效地处理错误消息?例如说(电子邮件已经存在或用户名已经存在)?
const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const userSchema = mongoose.Schema({
email : {type: String, required: true, unique: true},
password: {type : String, required: true},
userid: {type : String},
username: {type : String, required: true, unique: true},
})
userSchema.plugin(uniqueValidator);
userSchema.index({ '$**': 'text' })
module.exports = mongoose.model('User', userSchema);
和节点控制器:
exports.createUser = (req, res, next) => {
bcrypt.hash(req.body.password, 10).then(
(hash) => {
const user = new User({
email: req.body.email,
password: hash,
userid:req.body.userid,
username:req.body.username,
});
user.save().then(
() => {
res.status(201).json({
message: 'User added successfully!'
});
}
).catch(
(error) => {
res.status(500).json({
error: error
});
}
);
}
);
};
感谢帮助
您可以检查您的代码开头是否使用了电子邮件或用户名,并像这样发送带有自定义消息的 400-BadRequest:
exports.createUser = async (req, res, next) => {
let user = await User.findOne({ email: req.body.email });
if (user) return res.status(400).send("Email already exists");
user = await User.findOne({ username: req.body.username});
if (user) return res.status(400).send("Username already exists.");
...
请注意,我设置了异步,以便能够使用 await。
此外,我建议您使用 async/await 而不是 then catch 块来摆脱回调地狱。你的代码可以这样写 async/await:
exports.createUser = async (req, res, next) => {
try {
const { email, password, userId, username } = req.body;
let user = await User.findOne({ email });
if (user) return res.status(400).json({ error: "Email already exists" });
user = await User.findOne({ username });
if (user) return res.status(400).send({ error: "Username already exists" });
user = new User({ email, password, userId, username });
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(user.password, salt);
await user.save();
res.status(201).json({ message: "User added successfully!" });
} catch (error) {
res.status(500).json({ error });
}
};
每个人都认为它刚刚完成,就在前面处理错误 你作为响应发送 status 500 in catch,它会是这样的:
{driver: true, name: "MongoError", index: 0, code: 11000, keyPattern: {...}, ...}
代码:11000
driver:真
指数:0
关键模式:
电子邮件:1
原型:Object
核心价值:
电子邮件:“gjhk@ex.com”
原型:Object
名称:“MongoError”
原型:Object}
反应中的示例句柄:
register = async (name, lastName, email, password, cb) => {
try {
const res = await fetch('http://', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name, lastName, email, password })
})
const result = await res.json()
if (result.code === 11000) {
cb(11000)
}
if (res.status === 201) {
localStorage.setItem('authenticated', true)
localStorage.setItem('userName', result.user.name)
localStorage.setItem('userLastName', result.user.lastName)
localStorage.setItem('token', result.token)
cb()
} else {
cb(400)
}
} catch{
cb('Błąd serwera')
}
}
很抱歉回复的质量,这是我第一次用英文发表评论。
我对 Mongoose 中的唯一字段有疑问
当我尝试使用现有电子邮件或用户名创建新用户时它起作用了。
现在它总是发送错误 500。
但是有没有办法有效地处理错误消息?例如说(电子邮件已经存在或用户名已经存在)?
const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const userSchema = mongoose.Schema({
email : {type: String, required: true, unique: true},
password: {type : String, required: true},
userid: {type : String},
username: {type : String, required: true, unique: true},
})
userSchema.plugin(uniqueValidator);
userSchema.index({ '$**': 'text' })
module.exports = mongoose.model('User', userSchema);
和节点控制器:
exports.createUser = (req, res, next) => {
bcrypt.hash(req.body.password, 10).then(
(hash) => {
const user = new User({
email: req.body.email,
password: hash,
userid:req.body.userid,
username:req.body.username,
});
user.save().then(
() => {
res.status(201).json({
message: 'User added successfully!'
});
}
).catch(
(error) => {
res.status(500).json({
error: error
});
}
);
}
);
};
感谢帮助
您可以检查您的代码开头是否使用了电子邮件或用户名,并像这样发送带有自定义消息的 400-BadRequest:
exports.createUser = async (req, res, next) => {
let user = await User.findOne({ email: req.body.email });
if (user) return res.status(400).send("Email already exists");
user = await User.findOne({ username: req.body.username});
if (user) return res.status(400).send("Username already exists.");
...
请注意,我设置了异步,以便能够使用 await。
此外,我建议您使用 async/await 而不是 then catch 块来摆脱回调地狱。你的代码可以这样写 async/await:
exports.createUser = async (req, res, next) => {
try {
const { email, password, userId, username } = req.body;
let user = await User.findOne({ email });
if (user) return res.status(400).json({ error: "Email already exists" });
user = await User.findOne({ username });
if (user) return res.status(400).send({ error: "Username already exists" });
user = new User({ email, password, userId, username });
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(user.password, salt);
await user.save();
res.status(201).json({ message: "User added successfully!" });
} catch (error) {
res.status(500).json({ error });
}
};
每个人都认为它刚刚完成,就在前面处理错误 你作为响应发送 status 500 in catch,它会是这样的: {driver: true, name: "MongoError", index: 0, code: 11000, keyPattern: {...}, ...} 代码:11000 driver:真 指数:0 关键模式: 电子邮件:1 原型:Object 核心价值: 电子邮件:“gjhk@ex.com” 原型:Object 名称:“MongoError” 原型:Object}
反应中的示例句柄:
register = async (name, lastName, email, password, cb) => {
try {
const res = await fetch('http://', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name, lastName, email, password })
})
const result = await res.json()
if (result.code === 11000) {
cb(11000)
}
if (res.status === 201) {
localStorage.setItem('authenticated', true)
localStorage.setItem('userName', result.user.name)
localStorage.setItem('userLastName', result.user.lastName)
localStorage.setItem('token', result.token)
cb()
} else {
cb(400)
}
} catch{
cb('Błąd serwera')
}
}
很抱歉回复的质量,这是我第一次用英文发表评论。