【发布时间】:2023-02-15 08:58:54
【问题描述】:
如何在 Joi 包的帮助下检查传入的请求值是否唯一。
exports.createUser = {
body: Joi.object().keys({
email: Joi.string().required().email(),
password: Joi.string().required().custom(password),
phoneNumber: Joi.string().min(10).required(),
}),
};
在这里我想检查电子邮件是否是唯一的。我知道我可以在 mongoose(Schema) 中做到这一点,但我想用 joi 包来做到这一点。
API端点:
router
.route("/register")
.post(validate(userValidation.createUser), User.register);
注册控制器:
exports.register = catchAsync(async (req, res) => {
try {
var isValidated = await userService.validateInDatabase(req);
if (!isValidated)
return res
.status(409)
.json({ error: "Phone number or email is already registered" });
var user = await userService.create(req.body);
var token = await sendVerification(user);
return res.status(201).json({ user, token });
} catch (error) {
return res.status(400).json({ message: error });
}
});
我有一个名为 validateInDatabase 的函数,但我不想使用它。
userService.create服务函数:
exports.create = async (user) => {
const hashedPassword = passwordHash.generate(user.password);
let new_user = new User({
phoneNumber: user.phoneNumber,
email: user.email,
password: hashedPassword,
});
const payload = {
id: new_user._id,
};
let JWToken = jwt.sign(payload, keys.JWToken, { expiresIn: 31556926 });
const userData = await new_user.save();
return { userData, JWToken };
};
验证功能:
const validate = (schema) => (req, res, next) => {
const validSchema = pick(schema, ["params", "query", "body"]);
const object = pick(req, Object.keys(validSchema));
const { value, error } = Joi.compile(validSchema)
.prefs({ errors: { label: "key" }, abortEarly: false })
.validate(object);
if (error) {
const errorMessage = error.details
.map((details) => details.message)
.join(", ");
return res.status(400).json({ error: errorMessage });
}
Object.assign(req, value);
return next();
};
【问题讨论】:
标签: node.js express validation unique