Node.js MVC项目调用类方法报Cannot read property 'emailAddressValidation'错误如何解决
错误原因
你遇到的报错是因为类方法的this上下文丢失导致的:
类实例的普通方法默认依赖调用时的this指向实例本身,当你直接把UserValidation.loginValidation作为回调传给Express路由时,Express触发回调是独立执行该函数,没有绑定原实例作为执行上下文,此时方法内部的this为undefined,调用this.emailAddressValidation自然会抛出Cannot read property 'emailAddressValidation' of undefined的错误。
解决方案
你可以任选以下任意一种方法修复:
- 路由绑定时手动绑定上下文
用bind方法强制固定方法执行时的this指向UserValidation实例,修改路由代码为:router.post('/login', UserValidation.loginValidation.bind(UserValidation)); - 将类方法改写为箭头函数
箭头函数的this在定义时就绑定到所属实例,不会随调用方式变化而改变,修改类方法定义:class UserValidation { // 其他逻辑不变 loginValidation = (req, res, next) => { // 原有方法逻辑不变 } NewUserValidation = (req, res, next) => { // 原有方法逻辑不变 } } - 用匿名函数包裹方法调用
路由注册时用匿名函数包裹,通过实例调用方法,此时this会自动指向实例:router.post('/login', (req, res, next) => { UserValidation.loginValidation(req, res, next); });
额外注意
你当前代码中的passwordValidation方法仅定义了正则表达式,没有返回校验结果,后续开启注释中的校验逻辑时需要补充return regularExpression.test(password),否则校验判断会一直返回false。
内容的提问来源于stack exchange,提问作者Mohmad sabban
相关产品推荐
相关产品推荐

