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

MongoDB findOneAndUpdate()不支持回调函数的代码修复咨询

修复findOneAndUpdate()回调报错的方案

你遇到的错误是因为新版Mongoose/MongoDB驱动已经废弃了findOneAndUpdate的回调参数支持,现在必须使用Promise或async-await语法处理异步操作。以下是两种可行的修复方式:

方式1:使用async-await(推荐,代码更易读)

将路由处理函数改为async函数,用try/catch捕获错误:

// UPDATE - user update username
app.put('/users/:Username', async (req, res) => {
  try {
    const updatedUser = await Users.findOneAndUpdate(
      { Username: req.params.Username },
      {
        $set: {
          Username: req.body.Username,
          Password: req.body.Password,
          Email: req.body.Email,
          Birthday: req.body.Birthday
        }
      },
      { new: true } // 返回更新后的文档
    );

    if (!updatedUser) {
      return res.status(404).send('用户未找到');
    }

    res.json(updatedUser);
  } catch (err) {
    console.error(err);
    res.status(500).send('Error: ' + err);
  }
});

方式2:使用Promise链式调用

如果暂时不熟悉async-await,也可以用Promise的.then()和.catch()替代回调:

// UPDATE - user update username
app.put('/users/:Username', (req, res) => {
  Users.findOneAndUpdate(
    { Username: req.params.Username },
    {
      $set: {
        Username: req.body.Username,
        Password: req.body.Password,
        Email: req.body.Email,
        Birthday: req.body.Birthday
      }
    },
    { new: true }
  )
  .then(updatedUser => {
    if (!updatedUser) {
      return res.status(404).send('用户未找到');
    }
    res.json(updatedUser);
  })
  .catch(err => {
    console.error(err);
    res.status(500).send('Error: ' + err);
  });
});

额外提示

  • 确保你的Mongoose版本在v5及以上,这些版本原生支持async-await语法
  • 生产环境中不要直接存储明文密码,建议给Password字段添加哈希处理,这是用户数据安全的基本要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:52:15