MongoDB视频存在但Postman/客户端无法获取,删除无提示及Axios 404求助
问题描述
- MongoDB中已创建的视频数据在数据库可见,但通过Postman或网页端请求时,返回状态码200却无视频内容
- 删除视频后,数据库中该视频已被移除,但Postman未收到成功提示
- 出现AxiosError:
{message: 'Request failed with status code 404', name: 'AxiosError', code: 'ERR_BAD_REQUEST', ...}
相关代码
控制器函数(video.js)
export const random =async(req, res, next)=>{ try { const videos = await Video.aggregate([{$sample: {size:40}}]) res.status(200).json(videos) } catch (error) { next(err) } } export const sub = async(req, res, next)=>{ try { const user = await User.findById(req.user.id); const subscribedChannels = user.subscribedUsers; const list = await Promise.all( subscribedChannels.map((channelId) => { return Video.find({userId: channelId}); }) ); res.status(200).json(list.flat().sort((a,b)=>b.createdAt - a.createdAt)) } catch (error) { next(err) } }
路由配置(video路由)
import express from 'express'; import { addVideo, addView, deleteVideo, getByTags, getVideo, random, search, sub, trend, updateVideo } from '../controllers/video.js'; import { verifyToken } from '../verifyToken.js'; const router = express.Router(); router.post("/", verifyToken, addVideo) router.put("/:id", verifyToken, updateVideo) router.delete("/:id", verifyToken, deleteVideo) router.get("/find/:id", getVideo) router.put("/view/:id", addView) router.get("/trend", trend) router.get("/random", random) router.get("/sub", verifyToken, sub) router.get("/tags/:id", getByTags) router.get("/search/:id", search) export default router
排查与解决建议
修复控制器错误处理的变量名错误
两个控制器函数的catch块里都写了next(err),但实际捕获的错误变量是error,这会导致err未定义,错误无法正确传递到错误处理中间件,可能掩盖真实问题。改成:catch (error) { next(error) }检查deleteVideo控制器的实现
删除视频后无成功提示,大概率是deleteVideo函数没有返回响应。确保该函数在删除成功后返回状态码和提示信息,比如:export const deleteVideo = async(req, res, next)=>{ try { await Video.findByIdAndDelete(req.params.id); res.status(200).json({message: "视频已成功删除"}); } catch (error) { next(error); } }排查404错误的原因
- 检查请求URL是否与路由匹配:比如
/tags/:id和/search/:id路由要求携带id参数,如果请求时没传参数或路径写错(比如写成/tags而不是/tags/xxx)会返回404 - 验证
verifyToken中间件:sub和deleteVideo等接口依赖verifyToken,如果token无效或解析失败,req.user会不存在,后续查询出错;可以在中间件里添加日志,或者直接测试不带token的接口是否返回预期错误 - 检查Video模型的集合匹配:确保Video模型连接的是MongoDB中存放视频的正确集合,避免因集合名不匹配导致查询不到数据
- 检查请求URL是否与路由匹配:比如
调试random接口无数据的问题
- 如果数据库中视频数量不足40条,
$sample会返回所有现有视频,但如果数量为0则返回空数组;可以先把size改成1测试,看是否能返回数据 - 直接在MongoDB Compass里执行
db.videos.aggregate([{$sample: {size:40}}]),验证聚合查询是否能拿到数据,排除代码之外的问题
- 如果数据库中视频数量不足40条,
检查sub接口的逻辑
- 确认
User模型中的subscribedUsers字段存储的是正确的用户ID,且Video模型中的userId字段类型与之一致(都是ObjectId,而非字符串) - 如果用户没有订阅任何频道,
subscribedChannels为空数组,list.flat()后也是空数组,会返回空内容,这属于正常逻辑,但可以添加判断提示用户:const result = list.flat().sort((a,b)=>b.createdAt - a.createdAt); if(result.length === 0){ res.status(200).json({message: "你还没有订阅任何频道,暂无视频内容"}); } else { res.status(200).json(result); }
- 确认
内容的提问来源于stack exchange,提问作者balo balo
相关产品推荐
相关产品推荐

