Mongoose中使用randomatic生成唯一邀请码失败问题排查
解决Mongoose中邀请码默认值全重复的问题
问题原因
当前代码里,inviteCode字段的default直接赋值为randomize('0', 8)的执行结果。这会导致在Schema定义阶段就一次性执行randomize函数,生成的固定字符串会被当作所有新创建用户的默认邀请码,所以不管什么时候注册的用户,邀请码都完全一致。
修复方案
把default的值改成函数形式,Mongoose会在每次创建新文档时调用这个函数,生成新的随机邀请码:
import randomize from 'randomatic'; const userSchema = new Schema<UserDataInterface>( { username: { type: String, required: [true, "Please username is mandatory."], unique: false, }, // 改为函数形式,每次创建用户时生成新码 inviteCode: { type: String, default: () => randomize('0', 8) }, ... } );
额外建议:保证邀请码唯一性
虽然改成函数解决了重复生成的问题,但8位数字仍存在极低的碰撞概率。如果业务要求邀请码必须唯一,建议:
- 给
inviteCode字段添加唯一约束:
inviteCode: { type: String, default: () => randomize('0', 8), unique: true // 添加唯一约束 }
- 或者在保存前检查并生成唯一码(避免因碰撞导致保存失败):
userSchema.pre('save', async function(next) { // 仅在新建用户且未设置邀请码时执行 if (this.isNew && !this.inviteCode) { let uniqueCode; // 循环生成直到找到未被使用的邀请码 do { uniqueCode = randomize('0', 8); } while (await this.constructor.findOne({ inviteCode: uniqueCode })); this.inviteCode = uniqueCode; } next(); });
内容的提问来源于stack exchange,提问作者user824624
相关产品推荐
相关产品推荐

