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

如何用Express.js和Mongoose更新MongoDB对象数组?解决push报错

解决Mongoose更新数组元素taskStatus时的TypeError问题

错误原因

result.taskList[id]是taskList数组中的单个任务对象,并非数组类型,因此不存在push方法。你的需求是修改该任务对象的taskStatus属性,而非向其中添加新元素,调用push自然会触发类型错误。

修正后的代码

const taskcancel = (user, pswd, id) => {
  return db.Todotasks.findOne({ username: user, password: pswd }).then((result) => {
    if (result) {
      // 检查目标任务是否存在,防止下标越界
      if (!result.taskList[id]) {
        return {
          status: false,
          message: '任务不存在',
          statusCode: 400
        };
      }
      // 直接修改该任务的taskStatus属性
      result.taskList[id].taskStatus = 'canceled';
      // 更新任务计数
      result.taskCount.pendingTask -= 1;
      result.taskCount.canceledTask += 1;
      // 确保保存操作完成后再返回结果
      return result.save().then(() => {
        return {
          status: true,
          message: '任务已成功取消',
          statusCode: 200
        };
      }).catch(saveErr => {
        return {
          status: false,
          message: '保存失败:' + saveErr.message,
          statusCode: 500
        };
      });
    } else {
      return {
        status: false,
        message: '用户不存在或密码错误',
        statusCode: 404
      };
    }
  }).catch(queryErr => {
    return {
      status: false,
      message: '查询失败:' + queryErr.message,
      statusCode: 500
    };
  });
};

额外优化说明

  • 增加任务存在性检查:避免因id超出数组长度导致的无意义操作
  • 修复语法问题:原代码中用逗号代替分号的写法存在隐患,统一改为分号
  • 完善异步处理:通过链式调用确保save操作完成后再返回结果,避免异步状态不一致
  • 增加错误捕获:分别处理查询和保存阶段的异常,返回更明确的错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:11:13