Express GET请求返回404错误,查询MongoDB用户数据求助
问题排查与修复方案
1. 路由参数匹配验证
首先确认你的路由定义是否正确捕获邮箱参数。Express默认的路由参数匹配规则[^/]+支持@和.,但可以先在函数内打印参数,验证是否正确获取到完整邮箱:
export async function getUser(req, res){ const { email } = req.params; console.log('Received email:', email); // 检查控制台输出是否为success123@gmail.com // ... 剩余代码 }
如果参数不完整,可显式添加邮箱正则匹配路由:
app.get('/api/user/:email([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})', getUser);
2. 回调式查询无法被try/catch捕获错误
你使用了async函数,但UserModel.findOne的回调写法不会返回Promise,导致回调内的错误无法被外层try/catch捕获,反而同步错误(如UserModel未定义)会触发catch块返回404。改用Promise风格的查询:
export async function getUser(req, res){ const { email } = req.params; try { if(!email) return res.status(400).send({ error: "Invalid email"}) // 改用await捕获异步错误 const user = await UserModel.findOne({ email }); if(!user) return res.status(404).send({ error: "Couldn't Find User"}); return res.status(200).send(user) } catch (error) { console.error('Server error:', error); // 打印错误详情便于排查 return res.status(500).send({ error: "Server internal error"}) } }
同时修正状态码使用:
- 无效参数用
400(Bad Request),而非501 - 找不到用户用
404(Not Found) - 服务器错误用
500(Internal Server Error)
3. 检查UserModel导入与数据库连接
- 确认
UserModel已正确导入,路径和文件名无错误:import UserModel from '../models/User.js'; // 根据实际项目路径调整 - 验证MongoDB Atlas连接状态,启动时添加连接日志:
mongoose.connect(process.env.MONGODB_URI) .then(() => console.log('Connected to MongoDB successfully')) .catch(err => console.error('MongoDB connection failed:', err));
4. 邮箱大小写匹配问题
MongoDB查询默认区分大小写,若数据库中邮箱为Success123@gmail.com,而请求的是全小写,会导致查询失败。可改为不区分大小写查询:
const user = await UserModel.findOne({ email: { $regex: new RegExp(`^${email}$`, 'i') } });
或在Schema定义时设置自动转小写:
const userSchema = new mongoose.Schema({ email: { type: String, required: true, lowercase: true } });
内容的提问来源于stack exchange,提问作者user19756176
相关产品推荐
相关产品推荐

