Typescript Mongoose Middleware -输入“post”回调函数的参数

r1zhe5dt  于 2023-05-18  发布在  Go
关注(0)|答案(1)|浏览(180)

使用typescript和mongoose:我读了一点阅读,不知道发生了什么事...我正在添加mongoose中间件来定制重复的错误消息,但回调的参数没有类型化。正如你在下面看到的,我必须强制any类型来解决隐式的any错误。

// Define Schema...
// Then call this:
ProductSchema.post("save", function (error: any, doc: any, next: any) {
  if (error.code === 11000 && error.name === "MongoServerError") {
    next(
      new ApolloError(
        "A product with this name, category, and subcategory already exists. Please add it to your kit instead of creating it.",
        "DUPLICATE_PRODUCT"
      )
    );
  } else {
    next();
  }
});

// I then call the .model() method after this

我试过用Query传递泛型,ProductSchema.post<Query<Product, Product>>(...)
如果我删除doc参数,那么错误就会留下,但代码不会在重复的文档上执行。
任何建议将是伟大的!如果可能的话我想把它打出来!谢谢你的帮助。

7rfyedvj

7rfyedvj1#

我也遇到过类似的问题,虽然这个答案有点晚,但可以为其他人保存时间:
在Mongoose 6.8以上的版本中,您可以将{ errorHandler: true }添加到“help TypeScript out”和error:any以跳过Property 'code' does not exist on type 'NativeError'错误。

ProductSchema.post("save", { errorHandler: true }, function (error: any, doc, next) {
  if (error.code === 11000 && error.name === "MongoServerError") {
    next(
      new ApolloError(
        "A product with this name, category, and subcategory already exists. Please add it to your kit instead of creating it.",
        "DUPLICATE_PRODUCT"
      )
    );
  } else {
    next();
  }
});

最后,“unique”不是Mongoose中的验证器,一个问题是它需要一个字段索引来处理文档。因此,在模型中,可以添加ProductSchema.index({ "name": 1, "category": 1, "subcategory": 1}, { "unique": true });

相关问题