Express.js的/api/auth接口无响应求助(MERN栈学习中)
排查Express.js中/api/auth接口无响应问题
以下是导致接口一直处于"Processing"状态的核心问题及修复方案:
1. 数据库连接未处理异常,导致请求挂起
你的db.js中connectToMongo是异步函数,但index.js调用时既没有等待连接完成,也没有捕获连接错误。如果MongoDB服务未启动、连接地址有误,mongoose会持续尝试连接,后续数据库操作会一直处于pending状态,直接导致接口无响应。
修复方法:
修改index.js,用async/await处理数据库连接并捕获错误:
const connectToMongo = require("./db.js") const express = require('express') const startServer = async () => { try { await connectToMongo() const app = express() const port = 3000 app.use(express.json()) app.use("/api/auth", require("./routes/auth") ) app.use("/api/notes", require("./routes/notes") ) app.listen(port, () => { console.log(`Example app listening on port http://127.0.0.1:${port}`) }) } catch (err) { console.error("MongoDB连接失败:", err) process.exit(1) } } startServer()
同时确认本地MongoDB服务已启动,mongoURI地址无误(默认端口27017)。
2. 路由处理存在重复响应+未捕获数据库异常
auth.js的路由逻辑有两个关键问题:
- 先调用
res.send("aa")发送响应,后续又执行res.json(user),这不仅会导致报错,更严重的是User.create未捕获错误,当创建用户失败(比如缺少必填字段)时,Promise会reject但没有处理,请求会一直挂起。 - 验证规则中
body("email").isEmail缺少括号,应该是isEmail(),否则验证器不会生效。
修复后的auth.js:
const express = require("express") const router = express.Router() const User = require("../models/User") const { body, validationResult } = require('express-validator'); router.post("/", [ body('username').isLength({ min: 3 }), body("email").isEmail(), // 补上调用括号 body('password').isLength({ min: 6 }), ], async (req, res) => { // 先处理验证错误 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } try { // 模型中email是必填项,必须传入 const user = await User.create({ username: req.body.username, email: req.body.email, password: req.body.password, }); res.json(user); } catch (err) { console.error("创建用户失败:", err); res.status(500).json({ message: "服务器内部错误" }); } }) module.exports = router;
3. 创建用户时缺少必填的email字段
原代码中User.create只传入了username和password,但User模型里email是必填且唯一的字段,这会触发MongoDB的验证错误,而未捕获的错误会让请求一直处于pending状态。修复时要确保传入请求中的email字段。
内容的提问来源于stack exchange,提问作者Quiet Coder
相关产品推荐
相关产品推荐

