【问题标题】:How to define custom query helper in mongoose model with typescript?如何使用打字稿在猫鼬模型中定义自定义查询助手?
【发布时间】:2019-03-22 05:09:14
【问题描述】:

我想使用 query helper api 定义自定义查询助手。 这里是例子:

// models/article.ts

import { Document, Schema, Model, model } from 'mongoose';

interface IArticle extends Document {
   name: string;
}

interface IArticleModel extends Model<IArticle> {
   someStaticMethod(): Promise<any>;
}

const ArticleSchema = new Schema( { name: String } )

ArticleSchema.query.byName = function(name) {
    return this.find({ name })
}

export default model<IArticle, IArticleModel>('Article', ArticleSchema);



// routes/article.ts
import ArticleModel from '../models/article.ts'

router.get('/articles, (req, res) => {
    ArticleModel.find().byName('example')
})

当我使用默认值链接时,Typescript 抱怨 byName 方法。
我可以将它放在IArticleModel 接口中,但在这种情况下,我只能从模型中调用它。
我应该把这个方法的定义放在哪里才能以可链接的方式使用它?

【问题讨论】:

  • 好像应该是AnimalInstance.find()而不是AnimalSchema.find
  • @ExplosionPills 谢谢。我的错误我更新了问题
  • 看起来@types/mongoose 声明需要进行重大更改以支持自定义查询助手。我正在努力。

标签: javascript mongodb typescript mongoose


【解决方案1】:

我起草了支持查询助手的a new version of @types/mongoose。有关安装修改后的 @types 软件包的方法,请参阅 this answer。使用我的版本,您应该可以在models/article.ts 中编写以下内容:

import { Document, Schema, Model, model, DocumentQuery } from 'mongoose';

interface IArticle extends Document {
   name: string;
}

interface IArticleModel extends Model<IArticle, typeof articleQueryHelpers> {
   someStaticMethod(): Promise<any>;
}

const ArticleSchema = new Schema( { name: String } )

let articleQueryHelpers = {
    byName(this: DocumentQuery<any, IArticle>, name: string) {
        return this.find({ name });
    }
};
ArticleSchema.query = articleQueryHelpers;

export default model<IArticle, IArticleModel>('Article', ArticleSchema);

然后routes/article.ts 将起作用。如果这对你有用,那么我将在DefiniteTyped 上向原始包提交一个拉取请求。

【讨论】:

  • 谢谢它的工作,我实际上做了我自己的解决方案,但它没有你的那么优雅。
  • 好的,这里是the DefinitelyTyped pull request。
  • 我认为Promise&lt;any&gt; 应该改为MongooseQuery&lt;IArticle&gt;。我尝试了这个解决方案,但我无法在我的自定义函数(静态和查询帮助器)之后链接任何查询帮助器。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 2021-07-16
  • 2013-09-22
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2019-04-06
  • 2017-01-20
相关资源
最近更新 更多