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

注册功能报错咨询:TypeError读取username属性失败问题

问题分析与修复方案

核心问题定位

你的代码存在三个关键错误,导致了当前的异常表现:

  1. 数据库查询回调参数顺序错误
    MySQL(或mysql2)的query回调参数顺序为(err, results, fields),你写成了(err, result, data),导致data实际是字段元数据而非查询结果。这使得用户存在时的判断逻辑完全失效,同时用户不存在时错误进入创建流程。

  2. 多余的同步查询语句
    const result = db.query(q, [req.body.username]);这行代码无意义,会触发重复查询且未处理结果,直接删除即可。

  3. SQL插入语句语法错误
    插入语句中的VALUE应为复数VALUES,单数形式会导致SQL语法错误。

  4. 潜在的请求体解析问题
    如果你的Express应用未配置express.json()或body-parser中间件,req.body会是undefined,直接触发Cannot read properties of undefined (reading 'username')错误。


修正后的代码

export const register = (req, res) => {
  // 检查用户是否存在
  const q = "SELECT * FROM users WHERE username = ?";

  db.query(q, [req.body.username], (err, results) => {
    if (err) return res.status(500).json(err);
    // 存在查询结果则返回用户已存在提示
    if (results.length) return res.status(409).json("用户已存在!");

    // 创建新用户:哈希密码
    const salt = bcrypt.genSaltSync(10);
    const hashedPassword = bcrypt.hashSync(req.body.password, salt);

    const insertQ = "INSERT INTO users (`username`,`email`,`password`,`name`) VALUES (?)";
    const values = [
      req.body.username,
      req.body.email,
      hashedPassword,
      req.body.name,
    ];

    db.query(insertQ, [values], (err) => {
      if (err) return res.status(500).json(err);
      return res.status(200).json("用户创建成功。");
    });
  });
};

额外配置检查

确保你的Express主文件中添加了请求体解析中间件:

const express = require('express');
const app = express();
// 解析JSON格式的请求体
app.use(express.json());

内容的提问来源于stack exchange,提问作者Fadel Muhammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:35