已定义Schema和Model仍出现Username undefined错误求助
用户注册时Username undefined问题排查
问题根源
Express中间件顺序错误
服务器代码中,路由注册(server.use("/api/user", userRoute))被放在了请求体解析中间件(express.json()、express.urlencoded)之前。这会导致请求到达路由时,Express还未解析JSON格式的请求体,req.body处于undefined状态,自然无法读取req.body.username。Controller未完成核心逻辑
registerUser函数仅创建了User实例,但没有执行数据库保存操作,也未向客户端返回任何响应,会导致请求长期挂起。
修复方案
1. 调整中间件顺序
修改服务器代码,将请求体解析中间件放在路由注册之前:
const express = require("express"); const mongoose = require("mongoose"); const { MONGODB } = require("./config"); const userRoute = require("./routes/userRouter"); const PORT = process.env.PORT || 4000; mongoose .connect(MONGODB, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log("Database connected")) .catch((err) => { console.log(err); }); const server = express(); // 优先注册请求体解析中间件 server.use(express.urlencoded({ extended: true })); server.use(express.json()); // 注册路由 server.use("/api/user", userRoute); // 错误处理中间件放在最后 server.use((err, req, res, next) => { console.error(err); res.status(err.statusCode || 500).json({ message: err.message }); }); server.listen(PORT, () => console.log(`Server is listening on ${PORT}`));
2. 完善Controller逻辑
补充用户保存与响应代码,处理成功和异常情况:
const User = require("../models/user"); const registerUser = async (req, res, next) => { try { const user = new User({ username: req.body.username, employeeId: req.body.employeeId, accessLevel: req.body.accessLevel, role: req.body.role, company: req.body.company, password: req.body.password, email: req.body.email, createdAt: new Date(), }); const savedUser = await user.save(); res.status(201).json({ message: "用户注册成功", user: savedUser }); } catch (err) { next(err); } }; module.exports = { registerUser };
额外优化建议
- 禁止明文存储密码,使用
bcrypt等库对密码进行哈希处理后再存入数据库。 - 给Schema字段添加必填验证,例如
username: { type: String, required: true },提前拦截非法请求。
内容的提问来源于stack exchange,提问作者KwanYee Tan
相关产品推荐
相关产品推荐

