Node.js创建用户时报userValidation不是函数及joi.string未定义错误如何解决
报错解决方案
第一个报错:TypeError: userValidation is not a function
问题原因
validation.js采用命名导出的方式对外暴露方法,导出的内容是包含userValidation、loginValidation两个属性的对象,你在业务代码中直接将整个导出对象赋值给了userValidation变量,该变量本身不是函数,调用时就会触发报错。
修复方案
修改业务代码中validation模块的引入逻辑,使用解构赋值获取对应的校验方法:
// 替换原引入语句 const userValidation = require('./validation'); const { userValidation } = require('./validation');
第二个报错:TypeError: Cannot read property 'string' of undefined
问题原因
你安装的@hapi/joi为v17及以上版本,该版本做了不兼容的API迭代:
- 移除了顶层的
joi.validate()方法,改为先创建schema实例,再调用实例的validate方法 - 对象类型的校验规则需要用
Joi.object()包裹定义
修复方案
修改validation.js的代码如下:
const Joi = require('@hapi/joi'); // 用户注册校验 const userValidation = (data) => { const schema = Joi.object({ username: Joi.string().min(6).required(), password: Joi.string().min(6).required() }); return schema.validate(data); }; // 登录校验 const loginValidation = (data) => { const schema = Joi.object({ username: Joi.string().min(6).required(), password: Joi.string().min(6).required() }); return schema.validate(data); }; module.exports.userValidation = userValidation; module.exports.loginValidation = loginValidation;
其他需要修复的隐性问题
- 创建用户实例时密码赋值错误:你生成的哈希密码存在本地变量
hashedPassword中,不是请求体的参数,需要修改实例化逻辑:
const user = new userSchema({ username: req.body.username, password: hashedPassword // 替换原来的req.body.hashedPassword })
- 异步错误未捕获告警:
createUser是async异步函数,建议把所有业务逻辑包裹在try/catch块中,避免未捕获的异步错误触发UnhandledPromiseRejectionWarning告警,甚至导致进程退出。
内容的提问来源于stack exchange,提问作者Hesham Eldawy
相关产品推荐
相关产品推荐

