You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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迭代:

  1. 移除了顶层的joi.validate()方法,改为先创建schema实例,再调用实例的validate方法
  2. 对象类型的校验规则需要用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;

其他需要修复的隐性问题

  1. 创建用户实例时密码赋值错误:你生成的哈希密码存在本地变量hashedPassword中,不是请求体的参数,需要修改实例化逻辑:
const user = new userSchema({
    username: req.body.username,
    password: hashedPassword // 替换原来的req.body.hashedPassword
})
  1. 异步错误未捕获告警:createUser是async异步函数,建议把所有业务逻辑包裹在try/catch块中,避免未捕获的异步错误触发UnhandledPromiseRejectionWarning告警,甚至导致进程退出。

内容的提问来源于stack exchange,提问作者Hesham Eldawy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:54:01