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

使用Jest测试接口时出现版本字段错误的原因及解决方法

错误原因与解决方案

错误产生原因

你遇到的版本字段报错核心来自两点:

  • Mongoose默认会给所有通过Schema生成的文档实例自动添加__v版本字段,用于内部乐观并发控制。你在exec方法中调用save()后得到的genre是完整的Mongoose文档对象,天然携带__v字段
  • 你服务端的接口参数校验逻辑(通常是Joi等校验库实现)中,没有允许genre对象携带__v字段,因此请求被校验逻辑拦截,直接抛出__v字段不被允许的错误

解决方法

你可以任选以下任意一种方案修复:

  1. 仅传递必要字段,不要直接传整个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 
  });
  1. 手动剔除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 });
};
  1. 直接在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:48:03