我最近开始用GraphQL和Apollo研究服务器开发 . 在下面的代码中,获取每个数据的公式在某种程度上是可以理解的 .
schema.js
const { gql } = require('apollo-server');
const _ = require('lodash');
const onepieces = [
{
"id": "onepiece1",
"title": "원피스 1권",
"price": "1,360",
"desc": "동터오는 모험의 시대"
},
{
"id": "onepiece2",
"title": "원피스 2권",
"price": "1,360",
"desc": "대결 버기 해적단"
}
];
const narutos = [
{
"id": "naruto1",
"title": "나루토 1권",
"price": "1,360",
"desc": "나루토 모험의 시작"
},
{
"id": "naruto2",
"title": "나루토 2권",
"price": "1,360",
"desc": "나루토와 안개마을"
}
];
const typeDefs = gql`
type Onepiece { id: ID, title: String, price: String, desc: String }
type Naruto { id: ID, title: String, price: String, desc: String }
type Query {
onepiece(id: String!): Onepiece,
naruto(id: String!): Naruto,
getOnepieces: [Onepiece],
getNarutos: [Naruto]
}
`;
const resolvers = {
Query: {
onepiece: (parent, args) => _.find(onepieces, {id: args.id}),
naruto: (parent, args) => _.find(narutos, {id: args.id}),
getOnepieces: () => onepieces,
getNarutos: () => narutos
}
};
module.exports = { typeDefs, resolvers };
但这是低效的代码 . 如果漫画书的类别增加,我应该继续添加查询 . 所以我想提高更方便和可读性 .
例如,我想管理漫画书中的Onepiece和Naruto类别 .
我该如何改进?
1 回答
您可以从编写可能类别的GraphQL枚举开始 .
由于这两种漫画书具有相同的结构,因此您可以使用单个GraphQL类型来表示它们 . 我们将合并我们刚写的类别,以便您可以分辨出哪一个 .
有点标准convention for retrieving arbitrary GraphQL objects by their ID;虽然它来自Facebook 's Relay Javascript client it'并没有特别依赖于该客户端,我会在这里使用它 .
这将取代您的顶级查询,以按ID检索特定类型的图书;你可以写一个像这样的查询
现在你有了类别枚举,你也可以编写一个顶级查询来返回可能按类别过滤的漫画书
有一些相应的代码更改,使这项工作;我可能首先将两个漫画书列表合并为一个,并在那里添加类似的类别字段 .
完成此操作后,如果添加第三个类别,则需要将其添加到枚举中并将其添加到数据集中,但您不需要对代码,GraphQL架构或查询 .