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

Node.js搭配MongoDB后端PATCH请求无法更新日期类型字段问题求助

问题原因

  • $set操作符重复导致字段覆盖:JavaScript对象中不允许存在重复键,你在更新参数里写了三个$set,后续的$set会完全覆盖前面的,最终只有最后一个$set内的isMorningShift字段会被执行更新逻辑,前面的userEmail、shiftDate更新逻辑会被直接丢弃。
  • 日期字段类型转换失败:即便修正了$set的写法,若请求体传入的shiftDate是不符合ISO 8601标准的字符串、时间戳字符串或者空值,Mongoose自动转换Date类型会失败。由于updateOne默认不开启Schema校验,转换失败的字段会被静默忽略,不会抛出错误也不会执行更新。
  • 请求解析异常:如果PATCH请求没有设置正确的Content-Type: application/json请求头,后端body解析中间件会无法正确识别shiftDate字段,导致拿到的值为undefined,自然不会执行更新。

修复方案

  1. 修正更新语句的$set写法,把所有要更新的字段合并到同一个$set下,同时开启Schema校验方便排查参数错误:
router.patch('/:id', isLoggedIn, async (req, res) => {
    try {
        // 先校验日期格式合法性
        const shiftDate = new Date(req.body.shiftDate);
        if (isNaN(shiftDate.getTime())) {
            return res.status(400).json({message: 'shiftDate日期格式不合法'});
        }
        const updatedBooking = await Booking.updateOne(
            {_id: req.params.id},
            {
                $set: {
                    userEmail: req.body.userEmail,
                    shiftDate: shiftDate,
                    isMorningShift: req.body.isMorningShift
                }
            },
            { runValidators: true } // 开启Schema校验,参数不合法会抛出错误
        );
        res.json(updatedBooking);
    } catch (err) {
        res.status(500).send({message: err});
    }
});
  1. 发起PATCH请求时确认请求头设置了Content-Type: application/json,同时确保传入的shiftDate是合法的日期格式,比如2024-10-01、2024-10-01T12:00:00.000Z或者数字类型的时间戳。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:54:03