gpt4 book ai didi

javascript - 声明式与编程式 GraphQL

转载 作者:数据小太阳 更新时间:2023-10-29 06:09:51 26 4
gpt4 key购买 nike

我正在为新的全栈项目采用 GraphQL,我已经研究了许多概念并开始了我的第一个项目。

我的问题与使用声明式与编程式 GraphQL 模式定义有关。基本上所有我能在 GraphQL official site 中看到的使用声明式方法:您在一个或多个文件中定义架构,例如(感谢 this example here):

type Brand {
name: String
logoUrl: String
}
enum Gender {
MALE
FEMALE
}
type Image {
thumbnailUrl: String
smallUrl: String
mediumUrl: String
largeUrl: String
}
type Article {
id: ID! # non-nullable, is guaranteed to exist on every article
name: String
thumbnailUrl: String
brand: Brand
genders: [Gender]
images: [Image]
recommendations: [Article]
}
type Query {
Article(id: ID!): Article
Articles: [Articles]
}

即使对于某种复杂的数据结构,代码也非常简洁明了。

但是我在网络上看到的大多数示例,甚至是我研究过的书籍上的示例都使用编程方法来构建模式,例如:

import { GraphQLObjectType, GraphQLInputObjectType } from 'graphql';
import {GraphQLNonNull, GraphQLID, GraphQLList } from 'graphql';
import { GraphQLString, GraphQLInt, GraphQLBoolean } from 'graphql';

import { UserType } from '../User/types';
import UserModel from '../../../models/User';

const fields = {
_id: {
type: new GraphQLNonNull(GraphQLID)
},
name: {
type: GraphQLString
},
phone: {
type: GraphQLString
}
};

const CompanyType = new GraphQLObjectType({
name: 'Company',
description: 'Company',
fields: fields
})


const Company = {
type: CompanyType,
description: 'Get single company',
args: {
id: {
name: 'id',
type: new GraphQLNonNull(GraphQLID)
}
},
resolve(root, params) {

params.deleted = false;

return CompanyModel.find(params).exec();
}
}

const Companies = {
type: new GraphQLList(CompanyType),
description: 'Get all companies',
resolve(root) {
const companies = CompanyModel.find({ deleted: false }).exec();
if (!companies) {
throw new Error('Error getting companies.')
}
return companies;
}
}

export default {
Company,
Companies
}

我的目标是构建一个大型 SaaS 应用程序,因此架构会变得非常复杂,我担心代码很快就会变得复杂。

那么,我应该采用声明式方法、编程式方法还是两者的结合?

此处的最佳做法是什么?

最佳答案

关于这个话题有很多讨论 herehere .

恕我直言,使用 GraphQL 模式语言定义模式的最大优势是可读性。它使您的架构易于阅读和理解,尤其是对于可能正在查询端点但实际上并未参与端点设计的内部用户而言。我认为这也使得定义和更改架构更不容易出错。

另一方面,以编程方式定义模式提供了更多的灵 active 。例如,如果您使用 buildSchema,您只能为您的查询和变更传递解析器。如果您对使用默认解析器的每种类型都满意,那么这很好用——但是当您需要为各个字段定义解析器时会发生什么?

以编程方式定义架构允许您为您指定的任何类型中的各个字段定义解析器。这不仅有助于转换您从数据库返回的数据(将 thumbanail_url 转换为 thumbnailUrl 字段),而且如果这些字段需要额外的数据库查询,它除非实际请求该字段,否则它们不会启动,这可以显着提高性能。正如文档所指出的,如果您想自动生成模式,这种方法也很有用。

就个人而言,这就是我喜欢 graphql-tools 的原因 makeExecutableSchema .这是一种中间方法,允许您以非常简洁的方式定义类型(使用 GraphQL 模式语言),同时允许在实现解析器时有很大的灵 active 。

关于javascript - 声明式与编程式 GraphQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45390237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com