我创建了这个问题,以防有人对如何在 Apollo 中添加联合/多态类型感到好奇。希望这会让他们更容易。
在此示例中,我希望响应为 aWorksheet或ApiError
// typedefs.js
export default [`
schema {
query: Query
}
type Query {
worksheet(id: String!): Worksheet | Error
}
type Worksheet {
id: String!
name String
}
type ApiError {
code: String!
message: String!
}
`];
// resolvers.js
export default {
Query: {
worksheet(_, args, { loaders }) {
return loaders.worksheet.get(args.id).catch(() => {
// ApiError
return {
code: '1',
message: 'test'
}
});
}
}
};
// Express Server
import …Run Code Online (Sandbox Code Playgroud) 这是我的代码
const NewVerificationCode = () => {
const { loading, error, data = {}, refetch } = useQuery(CONFIRMATION_CODE, {
skip: true,
onError: (err) => {},
});
console.log(loading, error, data);
if (loading || error) {
return <ErrorLoadingHandler {...{ loading, error }} />;
}
return (
<form
onSubmit={(e) => {
refetch();
e.preventDefault();
}}
>
<div>
<button type="submit" className="signUpbutton">
{"Send the message again"}
</button>
</div>
</form>
);
};
const CONFIRMATION_CODE = gql`
query {
my {
sendNewTokenForConfirmation
}
}
`;
Run Code Online (Sandbox Code Playgroud)
当我提出请求时,我收到警告
替换 Query …
来自官方包文档:
GraphQLJSON 可以表示任何 JSON 可序列化的值,包括标量、数组和对象。GraphQLJSONObject 专门表示 JSON 对象,它涵盖了 JSON 标量的许多实际用例。
这听起来有点令人困惑,因为对我来说,这两个定义似乎非常相似。有人可以通过一个例子帮助我更好地理解这一点吗?谢谢期待。
我正在学习react-relay(v13),并且在使用@refetchable指定分页片段时遇到问题。这是一个非常基本的结构,如果不使用@refetchable,一切都会正常工作(即我可以查询grapql服务器,获取数据,使用Fragment渲染相同的查询/片段而无需分页)
\n当我在 ProjectsFragment_user 中引入 @refetchable 时,react-relay 编译器给出错误:
\n[ERROR] \xe2\x9c\x96\xef\xb8\x8e Invalid use of @refetchable on fragment 'ProjectsFragment_user', only supported are fragments on:\n - the Viewer type\n - the Query type\n - the Node interface or types implementing the Node interface\n - @fetchable type\nRun Code Online (Sandbox Code Playgroud)\n现在这很令人困惑,因为 ProjectsFragment_user 的查询如下所示:
\n// Dashboard.js\nexport const dashboardQuery = graphql`\nquery DashboardQuery ($id: ID) {\n user (id: $id){\n id \n name\n ...ProjectsFragment_user\n }\n}\n`;\n// then \nconst data = useLazyLoadQuery(dashboardQuery, {}, {},);\n\nRun Code Online (Sandbox Code Playgroud)\n//Projects.js defines fragment\n\nconst {data, loadNext} …Run Code Online (Sandbox Code Playgroud) 我使用react-router-relay并在我的一条路线中有一个下拉列表.
现在我从该下拉列表中选择一个不同的值 - 这将调用this.props.relay.setVariables哪个将根据此变量获取一些数据.此数据将显示在当前路径中的图表组件中.
如何提供回调或某些东西,以便知道当前组件现在正在获取数据/现在获取数据?
我需要这个能够在图表组件的顶部显示加载指示器.
我想我不能用react-router-relay它,因为它只能让我显示一个加载指示器而不是我当前的路线 - 但我想在当前路线中显示加载指示器.
请帮忙.
我将首先介绍我的应用程序:简单的投票应用程序,用户可以在其中创建投票并对其进行投票。简单。
当前,我的graphql模式由用户类型,投票类型和投票类型组成,其中用户和投票通过中继连接与其投票具有一对多关系。投票类型包含对其投票者和民意调查的引用,时间戳和实际投票值。
现在,据我所知,在规范graphql列表上使用连接的优点之一是能够在边缘上存储数据(除了分页等)。我该怎么办?
如果确实可行,我的计划是摆脱投票类型,直接通过连接连接用户及其投票的民意调查,并在连接边缘存储投票值及其时间戳。
如果重要的话,选民与其民意测验之间的联系应该是双向的,即每个用户都与他的投票民意测验相连,而每个民意测验都与其选民相连。
通过使用graphql-js,我需要通过迭代某些数据的数组来动态创建graphql模式,例如:
[{
name: 'author',
fields: [{
field: 'name'
}, {
field: 'books',
reference: 'book'
}]
}, {
name: 'book',
fields: [{
field: 'title'
}, {
field: 'author',
reference: 'author'
}]
}]
Run Code Online (Sandbox Code Playgroud)
问题是循环引用.当我创建AuthorType时,我需要创建BookType,反之亦然.
因此生成的模式应如下所示:
type Author : Object {
id: ID!
name: String,
books: [Book]
}
type Book : Object {
id: ID!
title: String
author: Author
}
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
我试图在我的GraphQL模拟服务器中生成10个项目的列表,如下所示:
import { makeExecutableSchema, addMockFunctionsToSchema, MockList } from 'graphql-tools';
import casual from 'casual';
import typeDefs from './schema.graphql';
export const schema = makeExecutableSchema({ typeDefs });
const mocks = {
File: () => ({
path: casual.random_element([
'/assets/images/cars/1.JPG',
'/assets/images/cars/2.JPG',
'/assets/images/cars/3.JPG',
'/assets/images/cars/4.JPG',
'/assets/images/cars/5.JPG',
'/assets/images/cars/6.JPG',
'/assets/images/cars/7.JPG',
]),
}),
UsedCar: () =>
new MockList(10, () => ({
price: casual.integer(10000, 99999999),
year: casual.integer(1990, 2017),
})),
};
// This function call adds the mocks to your schema!
addMockFunctionsToSchema({ schema, mocks });
Run Code Online (Sandbox Code Playgroud)
但我总是得到两辆二手车,我不知道为什么.有人可以帮忙吗?
此致,穆斯塔法
在编写查询时,我可以在任何字段上定义一个解析器,并且该字段的值将由其解析器确定,而与查询深度无关。
但是,当编写突变时,我似乎只能在根级别定义解析器。在我的args或输入类型的字段中添加resolve方法似乎没有任何影响。
处理突变中的嵌套输入的最佳方法是什么?
我试图从一个突变中返回一个查询类型,在某些情况下我可以使它工作,但不能按我想要的方式工作。该问题与所使用的查询类型没有特别关系,因为我发现使用以外的其他类型具有相同的行为Query。
您可以在https://codesandbox.io/s/1z8kjy8m93上运行和修改此代码
服务器
const { ApolloServer, gql } = require("apollo-server");
const typeDefs = gql`
type Query {
hello(msg: String): String
}
type Mutation {
someMutation(someArg: String): MutationResponse
}
type MutationResponse {
query: Query
status: String
}
`;
const resolvers = {
Query: {
hello: (root, args, context) => {
console.log("hello: args = ", args);
return `${args.msg}, world !`;
}
},
Mutation: {
someMutation: (root, args, context) => {
console.log("someMutation: args = ", args);
return { status: …Run Code Online (Sandbox Code Playgroud) graphql-js ×10
graphql ×6
reactjs ×4
apollo ×2
relayjs ×2
javascript ×1
json ×1
mocking ×1
react-apollo ×1
react-relay ×1
relaymodern ×1