如何通过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
相关产品推荐
相关产品推荐

