使用Jest测试接口时出现版本字段错误的原因及解决方法
错误原因与解决方案
错误产生原因
你遇到的版本字段报错核心来自两点:
- Mongoose默认会给所有通过Schema生成的文档实例自动添加
__v版本字段,用于内部乐观并发控制。你在exec方法中调用save()后得到的genre是完整的Mongoose文档对象,天然携带__v字段 - 你服务端的接口参数校验逻辑(通常是Joi等校验库实现)中,没有允许
genre对象携带__v字段,因此请求被校验逻辑拦截,直接抛出__v字段不被允许的错误
解决方法
你可以任选以下任意一种方案修复:
- 仅传递必要字段,不要直接传整个Mongoose文档对象。发送请求时只传
genre的业务需要字段即可,修改请求发送代码:
return await request(server) .post(config.get("URI") + "/movies") .set("x-auth-token", token) .send({ title, genre: { _id: genre._id, name: genre.name }, numberInStock: 1, dailyRentalRate });
- 手动剔除Mongoose文档的版本字段后再传递:调用Mongoose文档的
toObject()方法转为普通JS对象,再删除__v字段:
const exec = async () => { genre = await new Genre({ name: "abcde", }).save(); // 转为普通对象并删除版本字段 const plainGenre = genre.toObject(); delete plainGenre.__v; return await request(server) .post(config.get("URI") + "/movies") .set("x-auth-token", token) .send({ title, genre: plainGenre, numberInStock: 1, dailyRentalRate }); };
- 直接在Genre模型定义时禁用版本字段,这样生成的Genre文档就不会自带
__v字段:
// 修改genreSchema定义,添加versionKey配置 const genreSchema = new mongoose.Schema({ name: { type: String, required: true, minLength: 5, maxLength: 50, }, }, { versionKey: false }); // 禁用版本字段
额外注意事项
你当前的Genre模型定义中存在拼写错误:maxLenght正确拼写应为maxLength,该错误会导致字段最大长度校验失效,建议同步修正。
内容的提问来源于stack exchange,提问作者Daffy
相关产品推荐
相关产品推荐

