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

用户注册POST请求触发500 Internal Server Error故障排查求助

用户注册POST请求返回500错误且响应为空对象

之前注册功能运行正常,尝试用body parser解决header过大问题,卸载后出现500 Internal Server Error,响应为空对象{}。


相关代码及请求信息

index.js

const express = require("express");
const app = express();
const dotenv = require("dotenv");
const mongoose = require("mongoose");
const authRoute = require("./routes/auth");
const userRoute = require("./routes/users");
const postRoute = require("./routes/posts");
const categoryRoute = require("./routes/categories");
const multer = require("multer");
const path = require("path");

dotenv.config();

app.use("/images", express.static(path.join(__dirname, "/images")));

mongoose
  .connect(process.env.MONGO_URL)
  .then(console.log("Connected to MongoDB"))
  .catch((err) => console.log(err));

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "images");
  },
  filename: (req, file, cb) => {
    cb(null, req.body.name);
  },
});

const upload = multer({ storage: storage });
app.post("/api/upload", upload.single("file"), (req, res) => {
  res.status(200).json("File has been uploaded");
});
app.use(express.json());
app.use("/api/auth", authRoute);
app.use("/api/users", userRoute);
app.use("/api/posts", postRoute);
app.use("/api/categories", categoryRoute);

app.listen("5000", () => {
  console.log("Backend is running.");
});

auth.js

const router = require("express").Router();
const User = require("../models/User");
const bcrypt = require("bcrypt");

//REGISTER
router.post("/register", async (req, res) => {
  try {
    const salt = await bcrypt.genSalt(10);
    const hashedPass = await bcrypt.hash(req.body.password, salt);
    const newUser = new User({
      username: req.body.username,
      email: req.body.email,
      password: hashedPass,
    });

    const user = await newUser.save();
    res.status(200).json(user);
  } catch (err) {
    res.status(500).json(err);
  }
});

//LOGIN
router.post("/login", async (req, res) => {
  try {
    const user = await User.findOne({ username: req.body.username });
    !user && res.status(400).json("Wrong credentials!");

    const validated = await bcrypt.compare(req.body.password, user.password);
    !validated && res.status(400).json("Wrong credentials!");

    const { password, ...others } = user._doc;
    res.status(200).json(others);
  } catch (err) {
    res.status(500).json(err);
  }
});

module.exports = router;

请求体

{
  "username" : "radha",
  "email" : "krishna@gmail",
  "password" : "radha"
} 

响应结果

Status: 500 Internal Server Error

{}

问题排查与解决

  1. 调整express.json()中间件顺序
    当前app.use(express.json())放在路由挂载之后,导致authRoute无法解析JSON请求体,req.body为undefined,创建User对象时触发MongoDB验证错误,最终返回空对象。
    修复:将app.use(express.json())移到所有路由挂载之前,示例如下:

    dotenv.config();
    app.use(express.json()); // 提前到此处
    app.use("/images", express.static(path.join(__dirname, "/images")));
    
    // 其余代码保持不变
    
  2. 优化错误捕获逻辑
    直接返回err可能因错误对象存在循环引用等问题无法正常序列化,导致响应为空。修改catch块,打印并返回明确的错误信息:

    // auth.js注册路由的catch块修改
    catch (err) {
      console.error(err); // 控制台打印完整错误用于排查
      res.status(500).json({ message: err.message, detail: err._message });
    }
    
  3. 检查User模型与请求参数
    请求中的email为krishna@gmail,缺少域名后缀,若User模型设置了email格式验证,会导致保存失败,触发500错误。需确保请求参数符合模型验证规则,同时确认MongoDB连接状态正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:26:11