GraphQL、Apollo Express、MongoDBとMongooseを使用して小さなブログを作成しています。
現在、記事はIDで取得されており、訪問者はここで「123」と言うIDの記事を閲覧できます:example.com/articles/123
代わりに、スラッグを使用したいので、訪問者はexample.com/articles/same-article-as-aboveにアクセスできます。
これまでの私のリゾルバ:
import { gql } from 'apollo-server-express';
export default gql`
extend type Query {
articles: [Article!]
article(id: ID!): Article
}
type Article {
id: ID!
slug: String!
title: String!
desription: String!
text: String!
}
`;
別のクエリを追加するだけです。
articleBySlug(slug: String!): Article
これは完全にうまくいくでしょう。しかし、これは私にはあまりエレガントに見えず、基本的な理解が不足しているように感じます。タイトル、テキスト、説明などで記事を取得しようとするたびに、リゾルバーに新しいクエリを追加する必要がありますか?「articleByTitle」、「articleByDate」などのクエリがたくさん発生します。誰かが私にヒント、例、またはいくつかのベストプラクティスを教えてもらえますか(または、クエリをさらに追加する必要があることを確認してください☺)。
これを行う一般的な方法は、すべての入力を同じクエリに追加し、それらをオプションにすることです。
export default gql`
extend type Query {
articles: [Article!]
article(id: ID, slug: String, date: String, search: String): Article
}
type Article {
id: ID!
slug: String!
title: String!
description: String!
text: String!
}
`;
次に、リゾルバーでid
、slug
またはdate
が提供されていることを確認し、提供されていない場合はエラーを返します。
もう1つのオプションは、Gmailが使用するものと同様の検索文字列(たとえばid:x before:2012-12-12
)を使用して、リゾルバーで解析することです。
export default gql`
extend type Query {
articles: [Article!]
article(search: String): Article
}
type Article {
id: ID!
slug: String!
title: String!
description: String!
text: String!
}
`;
3番目のオプションは、いくつかのタイプを返すことができる個別の検索クエリを設定することです。
export default gql`
extend type Query {
articles: [Article!]
search(query: String!, type: SearchType): SearchResult
}
union SearchResult = Article | User
enum SearchType {
ARTICLE
USER
}
type Article {
id: ID!
slug: String!
title: String!
description: String!
text: String!
}
type User {
id: ID!
email: String!
name: String!
}
`;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加