You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 
排查与解决建议
  1. 修复控制器错误处理的变量名错误
    两个控制器函数的catch块里都写了next(err),但实际捕获的错误变量是error,这会导致err未定义,错误无法正确传递到错误处理中间件,可能掩盖真实问题。改成:

    catch (error) {
        next(error)
    }
    
  2. 检查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);
        }
    }
    
  3. 排查404错误的原因

    • 检查请求URL是否与路由匹配:比如/tags/:id和/search/:id路由要求携带id参数,如果请求时没传参数或路径写错(比如写成/tags而不是/tags/xxx)会返回404
    • 验证verifyToken中间件:sub和deleteVideo等接口依赖verifyToken,如果token无效或解析失败,req.user会不存在,后续查询出错;可以在中间件里添加日志,或者直接测试不带token的接口是否返回预期错误
    • 检查Video模型的集合匹配:确保Video模型连接的是MongoDB中存放视频的正确集合,避免因集合名不匹配导致查询不到数据
  4. 调试random接口无数据的问题

    • 如果数据库中视频数量不足40条,$sample会返回所有现有视频,但如果数量为0则返回空数组;可以先把size改成1测试,看是否能返回数据
    • 直接在MongoDB Compass里执行db.videos.aggregate([{$sample: {size:40}}]),验证聚合查询是否能拿到数据,排除代码之外的问题
  5. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:13:35