为什么我的模型上的猫鼬验证方法不适用于 Joi?
Why isn't my mongoose validation method on the model not working with Joi?
问题:
我设置了基本的身份验证流程。
我的用户模型上有这个自定义方法:
userSchema.methods.joiValidate = function() {
console.log(typeof this.username);
const Joi = require("joi");
const schema = {
username: Joi.types.String.min(6)
.max(24)
.required(),
email: Joi.types.String.email().required(),
password: Joi.types.String.min(8)
.max(30)
.regex(/[a-zA-Z0-9]{3,30}/)
.required()
};
return Joi.validate(this, schema);
};
但它没有按预期工作。
当我创建一个新用户并像这样验证它时:
const invalidUser = new User({
username: "bob",
email: "test@gmail.com",
password: "test123"
});
invalidUser.joiValidate();
我收到此错误消息:TypeError: Cannot read property 'String' of undefined
不知道为什么? this
在我的方法中指的是这个用户,当我在模型(文档)本身中 console.log 时,它上面有所有必填字段(用户名、电子邮件和密码)。
我也尝试 Joi.validate(this.toObject(), schema)
方法,但这并没有改变任何东西。
任何人都可以向我解释发生了什么以及为什么它不起作用吗?
任何想知道问题出在哪里的人 -
我不知何故弄乱了 joi 的整个语法(复制了一些我在 Whosebug 上找到的旧代码,哈哈)。
我是这样修复的:
userSchema.methods.joiValidate = function() {
// pull out just the properties that has to be checked (generated fields from mongoose we ignore)
const { username, email, password } = this;
const user = { username, email, password };
const Joi = require("joi");
const schema = Joi.object().keys({
username: Joi.string()
.min(6)
.max(24)
.required(),
email: Joi.string()
.email()
.required(),
password: Joi.string()
.min(8)
.max(30)
.regex(/[a-zA-Z0-9]{3,30}/)
.required(),
_id: Joi.string()
});
return Joi.validate(user, schema, { abortEarly: false });
};
问题:
我设置了基本的身份验证流程。 我的用户模型上有这个自定义方法:
userSchema.methods.joiValidate = function() {
console.log(typeof this.username);
const Joi = require("joi");
const schema = {
username: Joi.types.String.min(6)
.max(24)
.required(),
email: Joi.types.String.email().required(),
password: Joi.types.String.min(8)
.max(30)
.regex(/[a-zA-Z0-9]{3,30}/)
.required()
};
return Joi.validate(this, schema);
};
但它没有按预期工作。
当我创建一个新用户并像这样验证它时:
const invalidUser = new User({
username: "bob",
email: "test@gmail.com",
password: "test123"
});
invalidUser.joiValidate();
我收到此错误消息:TypeError: Cannot read property 'String' of undefined
不知道为什么? this
在我的方法中指的是这个用户,当我在模型(文档)本身中 console.log 时,它上面有所有必填字段(用户名、电子邮件和密码)。
我也尝试 Joi.validate(this.toObject(), schema)
方法,但这并没有改变任何东西。
任何人都可以向我解释发生了什么以及为什么它不起作用吗?
任何想知道问题出在哪里的人 - 我不知何故弄乱了 joi 的整个语法(复制了一些我在 Whosebug 上找到的旧代码,哈哈)。
我是这样修复的:
userSchema.methods.joiValidate = function() {
// pull out just the properties that has to be checked (generated fields from mongoose we ignore)
const { username, email, password } = this;
const user = { username, email, password };
const Joi = require("joi");
const schema = Joi.object().keys({
username: Joi.string()
.min(6)
.max(24)
.required(),
email: Joi.string()
.email()
.required(),
password: Joi.string()
.min(8)
.max(30)
.regex(/[a-zA-Z0-9]{3,30}/)
.required(),
_id: Joi.string()
});
return Joi.validate(user, schema, { abortEarly: false });
};