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

Express中执行findByIdAndDelete后find查询返回空(仍有记录)

日程删除接口异常问题定位

代码存在的两处硬伤

  • 查询取值错误是返回空结果的核心原因
    代码中执行删除后的查询逻辑,拿req.params.id作为userid的过滤条件。但当前接口路由路径为/schedule/deleteschedule,没有配置:id这类动态路由占位符,req.params下不存在id属性,最终查询条件等价于匹配userid = undefined的记录——哪怕数据库里留存着完全符合要求的有效日程,也会因为userid对不上返回空数组。
    实际使用时,已通过JWT鉴权中间件解析的用户ID一般会挂载在req.user对象上,而非存放在空的params结构里;如果是客户端主动传递的用户ID,也应该从req.body中获取,而非无意义的params对象。
  • 删除方法调用方式错误,删除逻辑完全未生效
    Mongoose提供的findByIdAndDelete方法,本身就是直接接收待删除文档的_id字段值作为入参,不需要额外包裹{_id: xxx}的对象结构。当前代码向该方法传递{_id: req.body.id},Mongoose无法正确解析目标ID,实际不会执行任何数据库删除操作,这也是为什么明明数据库里还有符合条件的记录,却看起来“删完查不到东西”的逻辑来源。

修正后的可运行参考代码

router.post('/schedule/deleteschedule', JWTAuthenticatToken, async (req, res) => {   
    // 直接传入待删除的_id值,不要包对象
    await Schedule.findByIdAndDelete(req.body.id)
    // 从鉴权解析结果中取真实userid做过滤
    const scheduleresult = await Schedule.find({userid: req.user.id}).sort({startdate: 1})
    console.log(scheduleresult)
    return res.json(scheduleresult)
});

补充优化建议:当前接口没有捕获异步操作的异常分支,如果数据库连接异常、ID格式不符合ObjectId规范,会直接导致接口无响应,建议为整个异步逻辑补充try/catch块做错误兜底。


内容的提问来源于stack exchange,提问作者Nat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 18:57:04