测试Express认证路由时遇404错误,请求排查帮助
排查Express路由返回404的可能原因
根据你提供的代码和问题描述,以下是几个重点排查方向:
1. 确认查询条件的ObjectID匹配
路由中使用req.user._id作为查询条件,但需要确保:
req.user._id的类型与数据库中user字段的类型一致。如果auth中间件返回的_id是字符串,而数据库中存储的是ObjectId类型,虽Mongoose通常会自动转换,但偶尔会出现匹配失败的情况。可以尝试手动转换后查询:
const answeredQuestions = await AnsweredQuestions.findOne({ user: mongoose.Types.ObjectId(req.user._id) });
- 打印
req.user._id的值,和数据库中目标文档的user字段值做直接对比,确保两者完全一致。
2. 检查Mongoose模型对应的集合名称
Mongoose默认会将模型名转换为小写复数形式作为集合名称。你定义的模型是AnsweredQuestions,对应的默认集合名是answeredquestions。但如果你在数据库中手动创建的集合名是其他(比如useranswers,因为你的模型文件名叫useranswers.js),就会导致查询不到数据。
解决方法:
- 直接修改模型定义,指定集合名称:
const AnsweredQuestions = mongoose.model('AnsweredQuestions', answeredQuestionsSchema, 'useranswers');
- 或者将数据库中的集合名改为
answeredquestions。
3. 验证Auth中间件的req.user正确性
在路由开头添加日志,确认auth中间件是否正确设置了req.user:
router.get('/answers', auth, async (req, res) => { console.log('当前用户信息:', req.user); // 打印用户信息 try { // ... 原有代码 } });
检查输出的_id是否与数据库中存在作答记录的用户ID一致,避免中间件返回了错误的用户信息。
4. 直接验证数据库查询结果
用MongoDB命令行或Compass直接执行查询,确认是否存在目标文档:
// 替换为你的用户ID db.answeredquestions.find({ user: ObjectId("你的用户ID字符串") })
注意替换集合名为实际存在的名称,如果查询无结果,说明数据库中确实没有匹配的记录,需要检查数据插入逻辑是否正确。
5. 确认路由挂载路径
如果返回的是Express默认的404(而非你代码中返回的"No answers found"),需要检查路由的挂载方式。比如如果你的app是这样挂载的:
app.use('/api', require('./routes/your-router'));
那么实际请求URL应该是/api/answers,而非/answers。可以在路由中添加日志,确认是否进入了路由处理函数:
router.get('/answers', auth, async (req, res) => { console.log('进入获取作答记录路由'); // ... 原有代码 });
如果日志没有打印,说明路由没有正确匹配,需要调整挂载路径或请求URL。
内容的提问来源于stack exchange,提问作者New coder
相关产品推荐
相关产品推荐

