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

如何通过Mongoose中间件生成必填字段codigoSS?

解决Mongoose必填字段自动生成前触发验证的问题

你遇到的核心问题是:Mongoose的文档验证流程在pre('save')钩子执行前就完成了。所以哪怕你在pre('save')里生成了codigoSS,验证阶段已经判定这个字段缺失,抛出必填错误。

要解决这个问题,只需要把生成codigoSS的逻辑从pre('save')钩子移到pre('validate')钩子中——因为Mongoose的钩子执行顺序是:pre('validate') → 文档验证 → pre('save')。这样在验证触发前就能生成必填字段,同时保持codigoSS的required: true配置。

修改后的代码如下:

import mongoose from "mongoose";

const solicitudSchema = new mongoose.Schema(
  {
    fechaSolicitud: {
      type: Date,
      required: true,
      default: Date.now
    },
    codigoSS: {
      type: String,
      unique: true,
      required: true,
    }
  },
  {
    timestamps: true,
  }
);

// 将pre('save')替换为pre('validate')
solicitudSchema.pre("validate", async function (next) {
  if (!this.codigoSS) {
    const count = await mongoose.models.Solicitud.countDocuments();
    this.codigoSS = `SS${String(count + 1).padStart(3, "0")}`;
    console.log(this.codigoSS);
  }
  next();
});

额外提醒:如果你的数据量很大,countDocuments()可能会有性能瓶颈,后续可以考虑用自增序列(比如单独维护一个计数集合)或者MongoDB的原子操作来优化,但当前方案完全能解决你现在的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:52:08