问题:
我已经建立了基本的身份验证流程。 我的用户模型上有以下自定义方法:
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)
的方法,但是没有任何改变。
有人可以向我解释发生了什么,为什么不起作用?
答案 0 :(得分:0)
对于任何人好奇的问题是什么? 我以某种方式搞砸了joi的整个语法(复制了我在Stack大声笑中找到的一些旧代码)。
我这样修复:
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 });
};