用户注册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
{}
问题排查与解决
调整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"))); // 其余代码保持不变优化错误捕获逻辑
直接返回err可能因错误对象存在循环引用等问题无法正常序列化,导致响应为空。修改catch块,打印并返回明确的错误信息:// auth.js注册路由的catch块修改 catch (err) { console.error(err); // 控制台打印完整错误用于排查 res.status(500).json({ message: err.message, detail: err._message }); }检查User模型与请求参数
请求中的email为krishna@gmail,缺少域名后缀,若User模型设置了email格式验证,会导致保存失败,触发500错误。需确保请求参数符合模型验证规则,同时确认MongoDB连接状态正常。
内容的提问来源于stack exchange,提问作者krishna
相关产品推荐
相关产品推荐

